这几天一直在做Java解析Json数据的一个项目,因为初识json,所以很多东西都是有着懵懂的认识。这里写下我解析时遇到的问题和收获。

我解析json时用到的是json-lib包。下载地址:http://json-lib.sourceforge.net。用这个包时,还要用到其他几个支持包:commons-lang.jar、commons-logging.jar,commons-beanutils.jar、xom-1.0-2005-01-05.jar、ezmorph-1.0.1.jar,以上包都可在http://json-lib.sourceforge.net下载。

先给出2个简单的例子。

1.java2json

样例:

public class testJson{
 public static void main(String[] args) {
    String json
= "{\"name\":\"reiz\"}";
    JSONObject
jsonObj = JSONObject.fromObject(json);
    String name
= jsonObj.getString("name");

jsonObj.put("initial", name.substring(0, 1).toUpperCase());

String[]
likes = new String[] { "JavaScript", "Skiing", "Apple Pie" };
   
jsonObj.put("likes", likes);

Map<String, String> ingredients = new
HashMap<String, String>();
   
ingredients.put("apples", "3kg");
   
ingredients.put("sugar", "1kg");
   
ingredients.put("pastry", "2.4kg");
   
ingredients.put("bestEaten", "outdoors");
   
jsonObj.put("ingredients",ingredients);

System.out.println(jsonObj);
    
}

}

输出结果:

{"name":"reiz","initial":"R","likes":["JavaScript","Skiing","Apple
Pie"],"ingredients":{"apples":"3kg","pastry":"2.4kg","bestEaten":"outdoors","sugar":"1kg"}}

java2json的资料网上很多,此不具体研究。

2.javafromjson

例子:

public class testJson{
 public static void main(String[] args) {
  String json =
"{x:'1',y:'2',userId:'112',element:[{id:'123',name:'haha'},{id:'456',name:'hehe'}]}";

JSONObject obj =
JSONObject.fromObject(json);
   String x =
obj.getString("x");
   String userid =
obj.getString("userId");
   System.out.println("x is:" +
x);
   System.out.println("userId
is:" + userid);
  
   //
数组array结果:[{"id":"123","name":"haha"},{"id":"456","name":"hehe"}]

JSONArray jsonArray =
obj.getJSONArray("element");
   for (int i = 0; i
< jsonArray.size(); i++) {
   
System.out.println("element " + i + " :" + jsonArray.get(i));
   }
 }
}

输出:

x is:1
userId is:112
element 0 :{"id":"123","name":"haha"}
element 1 :{"id":"456","name":"hehe"}

从上例可以看出,若取某一数组,可用json.get(i)取出。若想继续取出数组中第i个元素内的某一个值,如取出数组第一个元素中id的值,可用
(JSONObject)json.get(0).getInt("id")取出,为了看出细节,我们设取第二个元素中name的值,代码如下:

JSONObject obj2 = JSONObject.fromObject(array.get(1));
    
System.out.println(obj2.getString("name"));

输出结果为
hehe

可以看出一般步骤为:将要目标字符串转为JSON对象(JSONObject.fromObject()方法),再根据相应方法取出该对象中需要的值。

如果我们要将json反序列化为javabean呢?

String
jsonStr =
"{x:1,\"userId\":\"112\",element:[{id:'123',name:'haha'},{id:'456',name:'hehe'}]}";

Map<String,Class<?>>
m  = new
HashMap<String,Class<?>>();

m.put("x",
Integer.class);
   m.put("userId",
String.class);
 
 m.put("element",Element.class);
 
   Jsontobean
myBean  = (Jsontobean)JSONObject.toBean(
JSONObject.fromObject(jsonStr), Jsontobean.class, m );
   System.out.println("x: " +
myBean.getX());
   System.out.println("userId: "
+ myBean.getUserId());
 
   for(Element e :
myBean.getElement()){
    
System.out.println(e.getId() +"," + e.getName());
   }

public class Jsontobean {
    private int
x = 1;
    private
String userId = "112";
    private
List<Element> element;
    public int
getX() {
       
return x;
    }
    public void
setX(int x) {
       
this.x = x;
    }
    public
String getUserId() {
       
return userId;
    }
    public void
setUserId(String userId) {
       
this.userId = userId;
    }
    public
List<Element> getElement() {
       
return element;
    }
    public void
setElement(List<Element> element)
{
       
this.element = element;
   
}  
}

public class Element {
    private int
id;
    private
String name;
    private
Element source;
    public int
getId() {
       
return id;
    }
    public void
setId(int id) {
       
this.id = id;
    }
    public
String getName() {
       
return name;
    }
    public void
setName(String name) {
       
this.name = name;
    }
 public void setSource(Element source) {
  this.source = source;
 }
 public Element getSource() {
  return source;
 }
    public
String toString(){
        
return "" + id + "," + name;
    }
}

输出:

x: 1
userId: 112
123,haha
456,hehe

-------

附:jsontojava对象

1)JSONObject to DynaBean

所谓动态bean即是java运行的时候根据情况创建的,而不是程序员已经写好了的Bean。JsonLib会自动根据Json格式数据创建字段,然后创建一个包含这些字段的Object。代码片段:

  1. String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";
  2. JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str );
  3. DynaBean bean = (DynaBean) JSONSerializer.toJava( jsonObject );
  4. assertEquals( "JSON", bean.get("string") );
  5. assertEquals( new Integer(1), bean.get("integer") );
  6. assertEquals( new Double(2.0), bean.get("double") );
  7. assertEquals( Boolean.TRUE, bean.get("boolean") );

2)JSONObject to JavaBean

JSONLIB在转换的时候会自动查找关系,比如子类和父类
例如JSON数据源
   
String s =
"{'shopList':[{name:'重量',property:'p1'},{name:'尺寸',property:'p2'},
{name:'显卡 类型',property:'p3'},{name:'硬盘容量',property:'p4'},{name:'处理器
',property:'p5'},{name:'内存',property:'p6'},{name:'型号',property:'p7'},
{name:'货号',property:'p8'},{name:'品牌',property:'p9'}]}";
   存入Map
   map.put("shopList",
Shop.class);
   ShopList shopList = (ShopList)
JSONObject.toBean(JSONObject.fromObject(s), ShopList.class,
map);
JSONObject.toBean()方法的三个参数分别表示数据源对应的JSON对象,转化后的对象ShopList和数据源map。

这种方法和动态转换的区别在于,动态转换仅仅只是转为Object,而静态转换是转换为已经定义过的实体类,会自动映射。JSONObject.toBean()的参数介绍。

Java 与 Json的互相转换的更多相关文章

  1. 使用json-lib进行Java和JSON之间的转换 [转]

    [转] http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库,提供将Java对 ...

  2. Java对象 json之间的转换(json-lib)

    在这里主要简单的介绍一下,如何使用json-lib这个工具包来完成Java对象(或集合)与json对象(或集合)之间的转换~ 1. Java对象转换成json(既创建json) 关键类:JSONObj ...

  3. 【转】使用json-lib进行Java和JSON之间的转换

    原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库,提供将Java ...

  4. 使用json-lib进行Java和JSON之间的转换

    1. json-lib是一个java类库,提供将Java对象,包括beans, maps, collections, java arrays and XML等转换成JSON,或者反向转换的功能. 2. ...

  5. 使用json-lib进行Java和JSON之间的转换【转载】

    1. json-lib是一个java类库,提供将Java对象,包括beans, maps, collections, java arrays and XML等转换成JSON,或者反向转换的功能. 2. ...

  6. JAVA中JSON字符串格式转换

    alibabab版本  即com.alibaba.fastjson *以下Node为实体类 //JSON字符串->Map Map map1 = (Map)JSON.parse(strJson); ...

  7. Java集合 Json集合之间的转换

    1. Java集合转换成Json集合 关键类:JSONArray jsonArray = JSONArray.fromObject(Object obj); 使用说明:将Java集合对象直接传进JSO ...

  8. java中json和字符串互转及日期转换 练习

    一:以下是用到的jar名称: commons-beanutils-1.6.jar commons-collections-3.2.1.jar commons-lang-2.6.jar commons- ...

  9. JAVA中使用alibaba fastjson实现JSONObject、Object、Json字符串的转换

    JAVA中使用alibaba fastjson实现JSONObject.Object.Json字符串的转换 Object转JSON字符串:String jsonStr = JSONObject.toJ ...

随机推荐

  1. 使用Ocelot构建GateWay

    添加Nuget包:Ocelot 添加配置文件Ocelot.json 具体配置可以看另一篇Ocelot配置 Json配置文件主要包含两个根节点: ReRoutes:路由重定向配置 都是数组结构 可以配置 ...

  2. Android uses-permission 权限大全

    Android uses-permission 权限大全 当编写某些程序时,你需要调用手机的某些功能 这时候你一定要记得启用相关的uses-permission, 很多网上贴出来的代码都不包含 Man ...

  3. day11--RabbitMQ、Redis

        RabbitMQ:就是消息队列与Python里面的queue功能类似.线程和进程queue只能Python自己使用:不同机器和程序传递消息就要使用RabbitMQ了,中间传递. RabbitM ...

  4. WebApi 接口参数详解

    WebApi 接口参数不再困惑:传参详解   阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.“怪异”的get请求 二.post请求 1.基础类型参数 2.实体作为 ...

  5. UVA.11427.Expect the Expected(期望)

    题目链接 \(Description\) https://blog.csdn.net/Yukizzz/article/details/52084528 \(Solution\) 首先每一天之间是独立的 ...

  6. [HDU2874]Connections between cities

    思路:LCA裸题.本来是帮pechpo调错,结果自己写了半天… 设$dis_x$是点$x$到根结点距离,不难想到两点$u$.$v$之间最短距离等于$dis_u+dis_v-dis_{LCA(u,v)} ...

  7. BZOJ3779 : 重组病毒

    一个点的感染时间为它到根路径上虚边数+1. 用Link-Cut Tree模拟虚实边切换,每次切换时等价于在一段或两段DFS序区间更新,线段树维护即可. 时间复杂度$O(n\log^2n)$. #inc ...

  8. Code Forces 698A Vacations

    题目描述 Vasya has nn days of vacations! So he decided to improve his IT skills and do sport. Vasya know ...

  9. Codeforces Round #371 (Div. 1) C. Sonya and Problem Wihtout a Legend 贪心

    C. Sonya and Problem Wihtout a Legend 题目连接: http://codeforces.com/contest/713/problem/C Description ...

  10. android流量统计

    研究过一段时间的android流量统计发个自己的总结帖 1 android有一个TrafficStats类可以直接获取 总接受流量TrafficStats.getTotalRxBytes(), 总发送 ...