1.传统json解析
AAA处是实体类,BBB处是json数据的String格式
其余绿色的地方就是json数据中的标签名
private ArrayList<AAA> paser(String BBB) throws
JSONException {
ArrayList<AAA> list = new ArrayList<AAA>();
JSONObject json;
json = new JSONObject(str);
int rtnCode = json.getInt("rtnCode");
if (rtnCode == 0) {
list = new ArrayList<MainChargingBean>();
JSONArray jsonData = json.getJSONArray("a");
for (int i = 0; i < jsonData.length(); i++) {
JSONObject j = jsonData.getJSONObject(i);
MainChargingBean mcb = new MainChargingBean();
LatLng latLng = new LatLng(j.getDouble("b"),
j.getDouble("c"));
mcb.setName(j.getString("d"));
mcb.setFast_num(j.getString("e"));
mcb.setSlow_num(j.getString("f"));
mcb.setPoi_jing(j.getDouble("g"));
mcb.setPoi_wei(j.getDouble("h"));
mcb.setCharge_cost(j.getString("i"));
mcb.setCharge_cost_way(j.getString("j"));
mcb.setStop_cost(j.getString("k"));
mcb.setWork_open(j.getString("l"));
mcb.setWork_close(j.getString("m"));
mcb.setPosition(latLng);
list.add(mcb);
}
}
return list;
}
2. Gson和Json 的自动解析
2.1
Gson ---官方推出的自动解析工具
FastJson ---- 号称最快的json解析工具
2.2
手写实体封装类(JavaBeen)的严格要求,这是Gson和FastJson通过反射解析成功的前提条件,AS通过GsonFormat可以自动完成实体类的封装。
2.3 实体类要求:
* 用于封装fastjson或者gson解析后的得到的结果类型
* 在封装此类中有以下几点要求:
* 1. 该类中的所有属性的名字必须是json字符串中key的名字
* 2. 属性的类型,必须是key所对应的value的类型
* 3. 该类中的所有属性必须是private,并且必须按要求提供get,set方法
* 4. 该类中必须提供无参,有参的构造方法
*/
2.4 Gson的使用方式:
1. 将gson对应的jar包添加到工程的libs文件夹中,并且选择Add As Library方法将jar包添加到工程中使用
2. 根据json字符串创建一个JavaBean类文件(即自定义类文件)
3. 通过gson包中的Gson对象调用方法fromJson即可获取解析结果
2.5 FastJson的使用方式:
1. 将fastjson对应的jar包添加到工程的libs文件夹中,并且选择Add As Library方法将jar包添加到工程中使用
2.根据json字符串创建一个JavaBean类文件(即自定义类文件)
3.通过fastjson包中的JsonObject调用静态方法parseObject即可获取解析结果
3 Gson与FastJson简单实例
3.1异步任务和网络访问:
public class MyTextTask extends AsyncTask<String,Void,Gao> {
/**
*通过接口回调,用于数据的返回
*/
publicinterface DataCallback{
void getData(Gao list);
}
DataCallback callback;
public MyTextTask(DataCallbackcallback){
this.callback = callback;
}
@Override
protected Gao doInBackground(String... strings){
try {
HttpURLConnection conn =(HttpURLConnection) new URL(strings[0]).openConnection();
conn.setRequestMethod("GET");
conn.connect();
if(conn.getResponseCode()== 200){
InputStream is =conn.getInputStream();
byte[] b = new byte[1024];
int num = -1;
StringBuilderbuilder = new StringBuilder();
while((num =is.read(b))!=-1){
builder.append(new String(b,0,num));
}
String json = builder.toString();
/**
* 通过fastjson中的JSONObject对象调用
* parseObject方法即可实现json字符串的自动解析
* 参数:
* 1:要解析的字符串
* 2:字符串要解析成什么样类型的对象
*
*/
// Gao gao =com.alibaba.fastjson.JSONObject.parseObject(json,Gao.class);
/**
* 使用Gson进行自动解析
*/
Gson gson = new Gson();
Gao gao =gson.fromJson(json,Gao.class);
return gao;
}
} catch (IOException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Gao gao) {
super.onPostExecute(gao);
callback.getData(gao);
}
}
3.2 测试引用:
public class MainActivity extends Activity {
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 用于自动JSON解析数据返回测试
*/
/* new MyTextTask(newMyTextTask.DataCallback() {
@Override
public void getData(Gao list){
List<Info> infos =list.getInfo();
Log.i("===","====== gao infos "+infos.toString());
}
}).execute("http://www.h5151.com/ajax/hd_game/platform=2&compare=af9cd783af6a57e43edeb8bd54421d45");
*/
}
}
4 异步任务+接口回调+泛型+反射机制:
public class MyTextTask_Auto<T> extends AsyncTask<String,Void, T> {
/**
*定义接口回调,用于数据返回
*/
publicinterface DataCallback<T> {
void getData(T t);
}
DataCallback callback;
Class<T> cls;
public MyTextTask_Auto(DataCallback callback,Class<T> cls){
this.callback = callback;
this.cls =cls;
}
@Override
protected T doInBackground(String...strings) {
try {
HttpURLConnection conn =(HttpURLConnection) new URL(strings[0]).openConnection();
conn.setRequestMethod("GET");
conn.connect();
if(conn.getResponseCode()==200){
InputStream is =conn.getInputStream();
byte[] b = new byte[1024];
int num = -1;
StringBuilderbuilder = new StringBuilder();
while((num=is.read(b))!=-1){
builder.append(new String(b,0,num));
}
String json =builder.toString();
/**
* 使用Gson进行自动解析
*/
return new JsonUtils<T>().getData(json,cls);
}
} catch (IOException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(T t) {
super.onPostExecute(t);
callback.getData(t); //返回封装的对象
}
}
测试引用
public class MainActivity extends Activity {
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 泛型对象接口封装+接口回调+JsonFormat实体类自动生成
*/
new MyTextTask_Auto<GaoBean>(new MyTextTask_Auto.DataCallback<GaoBean>(){
@Override
public void getData(GaoBeangaoBean) {
List<GaoBean.InfoBean> infos = gaoBean.getInfo();
Log.i("====","===== gaoinfos " + infos.toString());
}
},GaoBean.class).execute("http://www.h5151.com/ajax/hd_game/platform=2&compare=af9cd783af6a57e43edeb8bd54421d45");
new MyTextTask_Auto<GiftBean>(new MyTextTask_Auto.DataCallback<GiftBean>(){
@Override
public void getData(GiftBeangiftBean) {
List<GiftBean.ResultBean> infos = giftBean.getResult();
Log.i("====","====="+ infos.toString());
}
},GiftBean.class).execute("http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json");
}
}