JSON之生成JSON字符串和解析

服务器和客服端的数据传输多数采用JSON数据形式传输。传输方需要生成JSON字符串,接收方需要解析JSON字符串。


以这个JSON字符串为例:JSON对象中包含一个JSON数组。数组中又是JSON对象。

{

  • code"1",
  • message"message",
  • totalPage "6",
  • 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 条新闻;"
      }
    ]
}

方式一: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.jar, 来自阿里巴巴工程师开发

资源地址:

简单使用: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方法即可



 
  








你可能感兴趣的:(GSON使用,JSON数据解析详解)