String parameter = {
success : 0,
errorMsg : "错误消息",
data : {
total : "总记录数",
rows : [ {
id : "任务ID",
workName : "任务名称",
assigneeName : "经办人姓名",
name : "流程步骤名称",
processInstanceInitiatorName : "发起人",
processInstanceStartTime : "发起时间",
createTime : "到达时间",
dueDate : "截止时间"
}, {
id : "ID",
workName : "名称",
assigneeName : "经办人",
name : "流程",
processInstanceInitiatorName : "发起人",
processInstanceStartTime : "发起",
createTime : "到达",
dueDate : "截止"
} ]
}
};
JSONObject jsonObject =JSONObject.fromObject(parameter);
System.out.println("success:"+jsonObject.get("success"));
System.out.println("errorMsg:"+jsonObject.get("errorMsg"));
System.err.println("total:"+jsonObject.getJSONObject("data").get("total"));
JSONObject data = jsonObject.getJSONObject("data");
JSONArray jsonArray = data.getJSONArray("row");
JSONObject row = null;
for (int i = 0; i < jsonArray.size(); i++) {
row = jsonArray.getJSONObject(i);
System.out.println("id:"+row.get("id"));
System.out.println("workName:"+row.get("workName"));
System.out.println("assigneeName:"+row.get("assigneeName"));
System.out.println("name:"+row.get("name"));
System.out.println("processInstanceInitiatorName:"+row.get("processInstanceInitiatorName"));
System.out.println("processInstanceStartTime:"+row.get("processInstanceStartTime"));
System.out.println("createTime:"+row.get("createTime"));
System.out.println("dueDate:"+row.get("dueDate"));
}
在复杂的JSON数据的格式中,往往会对JSON数据进行嵌套,这样取值会比之前的取值稍微复杂一点,但是只要思路清晰,其实取法还是一样的。就跟if else语句一样,如果if中套if,if中再套if,写的规范了还行,要是代码格式不规范,那我们肯定也看着麻烦。所以啊,对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找,一层层剥开,就清楚了。 举个例子说明,如下:
从外到里看,例子中就是一个数组,数组里面是两个json格式的字符串。这样分析思路就清晰多了。
例如以下的嵌套JSON数据:
[java]
- {
- "resultcode":"200",
- "reason":"成功的返回",
- "result":{
- "company":"顺丰",
- "com":"sf",
- "no":"575677355677",
- "list":[
- {
- "datetime":"2013-06-25 10:44:05",
- "remark":"已收件",
- "zone":"台州市"
- },
- {
- "datetime":"2013-06-25 11:05:21",
- "remark":"快件在 台州 ,准备送往下一站 台州集散中心 ",
- "zone":"台州市"
- }
- ],
- "status":1
- },
- "error_code":0
- }
那么这种多重嵌套的JSON数据应该从何入手?
道理很简单,每一层都当作是一个简单JSON数据,我们来分析一下:
这里的嵌套JSON数据,我们可以先看第一层,其实就是如下:
[java]
- {
- "resultcode":"200",
- "reason":"成功的返回",
- "error_code":0
- }
那么第二层就是在第一层的里面,其实第二层也可以看做是单独的一层,可以看做是这样的:
[java]
- {
- "result":{
- "company":"顺丰",
- "com":"sf",
- "no":"575677355677",
- "status":1
- }
- }
接下来最内的一层是JSONArray,对于这层,我们可以看成是数组的形式。
分析完上面复杂的JSON,知道怎么获取需要的值了吗?
根据分析的思路,我们来一一获取,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package com.json; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class JsonObjectAndJsonArrayDemo { public static void main(String[] args){ //复杂的json数据 String jsonStr = "{\"resultcode\":\"200\",\"reason\":\"成功的返回\",\"result\":{\"company\":\"顺丰\",\"com\":\"sf\"," + "\"no\":\"575677355677\",\"list\":[{\"datetime\":\"2013-06-25 10:44:05\",\"remark\":\"已收件\",\"zone\":\"台州市\"}," + "{\"datetime\":\"2013-06-25 11:05:21\",\"remark\":\"快件在 台州 ,准备送往下一站 台州集散中心 \",\"zone\":\"台州市\"}],\"status\":1}," + "\"error_code\":0}"; JSONObject json = JSONObject.fromObject(jsonStr); //得到整个json串 System.out.println("resultcode:"+json.getString("resultcode")); //根据key得到value:200 System.out.println("reason:"+json.getString("reason")); //根据key得到value:成功的返回 //当遇到result时,也是将它当成一个整体串 System.out.println("company:"+JSONObject.fromObject(json.getString("result")).getString("company")); System.out.println("com:"+JSONObject.fromObject(json.getString("result")).getString("com")); System.out.println("no:"+JSONObject.fromObject(json.getString("result")).getString("no")); //当遇到再次嵌套时,此时的list是一个JSONArray,所以需要将其当作数组的形式处理,其实还是一个串 //get(i)以下标为主,里面的东西,其实也是一个json的形式数据,你可以不看外面怎么嵌套,按道理只当成单单一个json串处理即可 System.out.println("list(0).datetime:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("datetime")); System.out.println("list(0).remark:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("remark")); System.out.println("list(0).zone:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("zone")); System.out.println("list(1).datetime:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("datetime")); System.out.println("list(1).remark:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("remark")); System.out.println("list(1).zone:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("zone")); System.out.println("status:"+JSONObject.fromObject(json.getString("result")).getString("status")); System.out.println("reason:"+json.getString("error_code")); } } fastjson是一个比较好的工具包,使用起来也很方便。 一、 1.类,json对象转成json字符串 [java] - JSONObject json = new JSONObject();
- json.put("page",1);
- json.put("pageSize",10);
- json.toJSONString();
还有Map集合在放进JSONObject,变成json字符串 [java] - Map<T,T> map = new HashMap<T,T>();
- map.put("page",1);
- map.put("pageSize",10);
- json.putAll(map);
- json.toJSONString();
将一个类变成一个json类型的字符串 [java] - JSONObject.toJSONString(object);
- JSON.toJSONString(object)
二、 1.在json变成雷对象之前先学会得到一个jsonObject中的某个数据的值 [java] - JSONOnject obj = new JSONObject();
- //如果我们需要判断json中是否包含这个键值对,
- (1).boolean b = obj.containKey("key");
- (2).String res = obj.getString("key");
- if (res != null) {
- System.out.println(res);
- }
- //如果想继续得到JSONObject
- JSONObject obj1 =obj.getJSONObject(str2);
- //如果想继续得到值为字符串键值对;
- String jsonStr = obj.getString("");
- //如果是得到Object,适合得到对应的值,下面没有数据
- Onject obj2 = obj.get(str2);
- //如果知道对应值得类型,还可以直接得到该类型的数据,基本类型必须是它的包装类,举例
- int num = obj.getInteger("num");
- String s2 = obj.getBoolean("name");
2.json字符串变成一个类对象,要求字符串必须符合json格式 [java] - JSONObject json = JSONObject.parseObject(str)
后面都是在json类型的字符串已经转出JSONObject的基础上。 [java] - Object o = JSON.toJavaObject(json,Object.class);
- Object o = json.toJavaObject(Object.class);(二选一)
[java] - 得到List集合的两种方法。
- JSONArray jsonArr = json.getJSONArray("");(从JSONObject得到JSONArray对象)
- List<T> list = jsonArr.toJavaList(T.class);
如果本身是数组形式的字符串可以使用下面的方法 [java] - List<T.class> list = JSON.parseArray(str,T.class);
fastjson是一个比较好的工具包,使用起来也很方便。 一、 1.类,json对象转成json字符串 [java] - JSONObject json = new JSONObject();
- json.put("page",1);
- json.put("pageSize",10);
- json.toJSONString();
还有Map集合在放进JSONObject,变成json字符串 [java] - Map<T,T> map = new HashMap<T,T>();
- map.put("page",1);
- map.put("pageSize",10);
- json.putAll(map);
- json.toJSONString();
将一个类变成一个json类型的字符串 [java] - JSONObject.toJSONString(object);
- JSON.toJSONString(object)
二、 1.在json变成雷对象之前先学会得到一个jsonObject中的某个数据的值 [java] - JSONOnject obj = new JSONObject();
- //如果我们需要判断json中是否包含这个键值对,
- (1).boolean b = obj.containKey("key");
- (2).String res = obj.getString("key");
- if (res != null) {
- System.out.println(res);
- }
- //如果想继续得到JSONObject
- JSONObject obj1 =obj.getJSONObject(str2);
- //如果想继续得到值为字符串键值对;
- String jsonStr = obj.getString("");
- //如果是得到Object,适合得到对应的值,下面没有数据
- Onject obj2 = obj.get(str2);
- //如果知道对应值得类型,还可以直接得到该类型的数据,基本类型必须是它的包装类,举例
- int num = obj.getInteger("num");
- String s2 = obj.getBoolean("name");
2.json字符串变成一个类对象,要求字符串必须符合json格式 [java] - JSONObject json = JSONObject.parseObject(str)
后面都是在json类型的字符串已经转出JSONObject的基础上。 [java] - Object o = JSON.toJavaObject(json,Object.class);
- Object o = json.toJavaObject(Object.class);(二选一)
[java] - 得到List集合的两种方法。
- JSONArray jsonArr = json.getJSONArray("");(从JSONObject得到JSONArray对象)
- List<T> list = jsonArr.toJavaList(T.class);
如果本身是数组形式的字符串可以使用下面的方法 [java] - List<T.class> list = JSON.parseArray(str,T.class);
|