服务器和客服端的数据传输多数采用JSON数据形式传输。传输方需要生成JSON字符串,接收方需要解析JSON字符串。
以这个JSON字符串为例:JSON对象中包含一个JSON数组。数组中又是JSON对象。
{
方式一:org.json方式。
public void createJSONStr() throws JSONException { JSONArray array = new JSONArray(); for (int i = 20; i < 40; i++) { JSONObject ob = new JSONObject(); ob.put("msg", "第 " + i + " 条新闻"); array.put(ob); } JSONObject OB = new JSONObject(); OB.put("code", "1"); OB.put("message", "message"); OB.putOpt("content", array); String jsonStr = OB.toString(); Log.v("test", jsonStr); // ------------------上面是构造JSON对象,下面将这个JSON对象解析成Msg类对象 和Info对象。 JSONObject object = new JSONObject(jsonStr); JSONArray arrayInfo = object.getJSONArray("content"); for (int i = 0; i < arrayInfo.length(); i++) { JSONObject o = arrayInfo.getJSONObject(i); String msg = o.getString("msg"); Log.v("test", msg); } }log打印结果:
11-25 09:24:38.620: V/test(8210): {"content":[{"msg":"第 20 条新闻"},{"msg":"第 21 条新闻"},{"msg":"第 22 条新闻"},{"msg":"第 23 条新闻"},{"msg":"第 24 条新闻"},{"msg":"第 25 条新闻"},{"msg":"第 26 条新闻"},{"msg":"第 27 条新闻"},{"msg":"第 28 条新闻"},{"msg":"第 29 条新闻"},{"msg":"第 30 条新闻"},{"msg":"第 31 条新闻"},{"msg":"第 32 条新闻"},{"msg":"第 33 条新闻"},{"msg":"第 34 条新闻"},{"msg":"第 35 条新闻"},{"msg":"第 36 条新闻"},{"msg":"第 37 条新闻"},{"msg":"第 38 条新闻"},{"msg":"第 39 条新闻"}],"message":"message","code":"1"}
11-25 09:24:38.620: V/test(8210): 第 20 条新闻
11-25 09:24:38.620: V/test(8210): 第 21 条新闻
11-25 09:24:38.620: V/test(8210): 第 22 条新闻
11-25 09:24:38.624: V/test(8210): 第 23 条新闻
11-25 09:24:38.624: V/test(8210): 第 24 条新闻
11-25 09:24:38.624: V/test(8210): 第 25 条新闻
11-25 09:24:38.628: V/test(8210): 第 26 条新闻
11-25 09:24:38.628: V/test(8210): 第 27 条新闻
11-25 09:24:38.628: V/test(8210): 第 28 条新闻
11-25 09:24:38.632: V/test(8210): 第 29 条新闻
11-25 09:24:38.632: V/test(8210): 第 30 条新闻
11-25 09:24:38.632: V/test(8210): 第 31 条新闻
11-25 09:24:38.636: V/test(8210): 第 32 条新闻
11-25 09:24:38.636: V/test(8210): 第 33 条新闻
11-25 09:24:38.636: V/test(8210): 第 34 条新闻
11-25 09:24:38.640: V/test(8210): 第 35 条新闻
11-25 09:24:38.640: V/test(8210): 第 36 条新闻
11-25 09:24:38.640: V/test(8210): 第 37 条新闻
11-25 09:24:38.640: V/test(8210): 第 38 条新闻
11-25 09:24:38.644: V/test(8210): 第 39 条新闻
方式二:Gson方式:谷歌官方提供的一个api,实用性肯定是更强大的。
下载地址:http://download.csdn.net/detail/tom_xiaoxie/9300989
解析JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>>
Gson将上述四种数据对象转化为JSON字符串的方法都是一样的,
<span style="color:#ff0000;">Gson gjon = new Gson(); String jsonStr = gjon.toJson(obj);</span>而将JSON字符串转换为以上四种数据对象只需调用:
Obj = g.fromJson(msg, Obj .class);
所以就要根据JSON字符串组织形式来构造javaBean类了,从里到外一个一个构造,一个{ }为一个类。一个[ ]就该为一个集合类型数据。各个JavaBean的字段属性还需要一一对应。
如上面的JSON字符串就构造了如下两个类:
Msg类:
public class Msg { private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }Info类:
public class Info { private String code; private String message; private ArrayList<Msg> content; private String totalPage; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public ArrayList<Msg> getContent() { return content; } public void setContent(ArrayList<Msg> content) { this.content = content; } public String getTotalPage() { return totalPage; } public void setTotalPage(String totalPage) { this.totalPage = totalPage; } }那么采用GSON方式构造上面的JSON字符串代码如下:
public void SreateJSON(){ ArrayList<String> strlist = new ArrayList<String>(); for(int i=20;i<40;i++){ String msg = "第 " + i +" 条新闻;"; strlist.add(msg); } ArrayList<Msg> list = new ArrayList<Msg>(); for(int i = 0;i<strlist.size();i++){ Msg msg = new Msg(); msg.setMsg(strlist.get(i)); list.add(msg); } Info info = new Info(); info.setCode("1"); info.setContent(list); info.setMessage("message"); info.setTotalPage("6"); Gson gjon = new Gson(); String jsonStr = gjon.toJson(info); }
<span style="white-space:pre"> </span>Gson g = new Gson(); Info info = g.fromJson(msg, Info.class); totalPage = Integer.valueOf(info.getTotalPage()); ArrayList<Msg> msgList = info.getContent(); ArrayList<String> strList = new ArrayList<String>(); for(Msg m: msgList){ Log.v("test", m.getMsg(); }
List<JavaBean>类型
当然对于List<JavaBean>这种数据类型,也可以直接一个方法搞定,前提是该有的JavaBean类都已经建好了。如:
将json字符串转化成List<JavaBean>对象
Person person1 = new Person("香港","刘德华",1001);
Person person2 = new Person("韩国","宋慧乔",1002);
List<Person> persons = new ArrayList<Person>();
persons.add(person1);
persons.add(person2);
Gson gson = new Gson();
//这里将lsit<javabean>转化成json字符串
String jsonString = gson.toJson(persons);
//解析json字符串
List<Person> persons2 = gson.fromJson(jsonString, new TypeToken<List<Person>>(){}.getType()) ;
List<Map<String,Object>>类型
将json字符串转化成List<Map<String,Object>>对象
Map<String,Object> map = new HashMap<String,Object>();
map.put("key1", "value1");
map.put("key2", "value2");
Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("key1", 1);
map2.put("key2", 2);
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
list.add(map);
list.add(map2);
Gson gson = new Gson();
String jsonString = gson.toJson(list);
System.out.println("json字符串:"+jsonString);
//解析json字符串
List<Map<String,Object>> list2 = gson.fromJson(jsonString, new TypeToken<List<Map<String,Object>>>(){}.getType());
资源地址:
简单使用:fastJson最主要的使用入口是com.alibaba.fastjsoon.JSON
提供了如下方法:
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final <T> T parseObject(String text, Class<T> class); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> class); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。
全都是static的。使用起来非常方便。
应用实例:
/** * fastjson 处理JSON */ public void createJSONByFastJson(){ ArrayList<String> strlist = new ArrayList<String>(); for(int i=20;i<40;i++){ String msg = "第 " + i +" 条新闻;"; strlist.add(msg); } ArrayList<Msg> list = new ArrayList<Msg>(); for(int i = 0;i<strlist.size();i++){ Msg msg = new Msg(); msg.setMsg(strlist.get(i)); list.add(msg); } Info info = new Info(); info.setCode("1"); info.setContent(list); info.setMessage("message"); info.setTotalPage("6"); String fastJson = com.alibaba.fastjson.JSONObject.toJSONString(info); Log.d("test", fastJson); //log打印出来是完全正确的 //----------------上面生成JSON字符串,下面来将JSON字符串解析成对象 Info decodeInfo = (Info) com.alibaba.fastjson.JSONObject.parseObject(fastJson, Info.class); Log.d("test", decodeInfo.getCode()); //打印出来是 1 ArrayList<Msg> msgs = decodeInfo.getContent(); for(Msg m:msgs){ Log.d("test", m.getMsg()); } }
打印的log:
11-26 08:42:00.389: D/test(20664): {"code":"1","content":[{"msg":"第 20 条新闻;"},{"msg":"第 21 条新闻;"},{"msg":"第 22 条新闻;"},{"msg":"第 23 条新闻;"},{"msg":"第 24 条新闻;"},{"msg":"第 25 条新闻;"},{"msg":"第 26 条新闻;"},{"msg":"第 27 条新闻;"},{"msg":"第 28 条新闻;"},{"msg":"第 29 条新闻;"},{"msg":"第 30 条新闻;"},{"msg":"第 31 条新闻;"},{"msg":"第 32 条新闻;"},{"msg":"第 33 条新闻;"},{"msg":"第 34 条新闻;"},{"msg":"第 35 条新闻;"},{"msg":"第 36 条新闻;"},{"msg":"第 37 条新闻;"},{"msg":"第 38 条新闻;"},{"msg":"第 39 条新闻;"}],"message":"message","totalPage":"6"} 11-26 08:42:00.393: D/test(20664): 1 11-26 08:42:00.393: D/test(20664): 第 20 条新闻; 11-26 08:42:00.397: D/test(20664): 第 21 条新闻; 11-26 08:42:00.397: D/test(20664): 第 22 条新闻; 11-26 08:42:00.397: D/test(20664): 第 23 条新闻; 11-26 08:42:00.401: D/test(20664): 第 24 条新闻; 11-26 08:42:00.401: D/test(20664): 第 25 条新闻; 11-26 08:42:00.401: D/test(20664): 第 26 条新闻; 11-26 08:42:00.401: D/test(20664): 第 27 条新闻; 11-26 08:42:00.405: D/test(20664): 第 28 条新闻; 11-26 08:42:00.405: D/test(20664): 第 29 条新闻; 11-26 08:42:00.409: D/test(20664): 第 30 条新闻; 11-26 08:42:00.409: D/test(20664): 第 31 条新闻; 11-26 08:42:00.409: D/test(20664): 第 32 条新闻; 11-26 08:42:00.413: D/test(20664): 第 33 条新闻; 11-26 08:42:00.413: D/test(20664): 第 34 条新闻; 11-26 08:42:00.413: D/test(20664): 第 35 条新闻; 11-26 08:42:00.413: D/test(20664): 第 36 条新闻; 11-26 08:42:00.413: D/test(20664): 第 37 条新闻; 11-26 08:42:00.417: D/test(20664): 第 38 条新闻; 11-26 08:42:00.417: D/test(20664): 第 39 条新闻;
总结:
org.json相对繁琐,通过key值可以一层一层的获取到需要的信息,
Encode时构造好层级关系后直接toString()即可;
Decode时需要new JSONObject(jsonStr) 然后再一层一层的getJSONObject(String key)或者是getJSONArray(String key);
Gson.jar相对简单,只需要new Gson() .构造好层级关系后,调用toJson(JavaBean) 或者fromJson(
Encode:Gson gjon = new Gson();String jsonStr = gjon.toJson(info);
Decode:Gson g = new Gson();Info info = g.fromJson(msg, Info.class);
fastjson.jar也很适用,由于全是static方法,只需调用JSONObject.toJSONString(JavaBean)或者是JSONObject.parseJSONxxx(JSONstr, JavaBean)即可
Encode:JSONObject.toJSONString(JavaBean)
Decode: JSONObject.parseJSONxxx(JSONstr, JavaBean) 根据解析的JSON字符串调用对应的static方法即可