这几天一直在做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. 微信小程序Http高级封装 es6 promise

    公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意. 于是上网查了一下,就开始着手开发..... 首先开发客户端的东西,都有个共同点,那就是  数据请求! 看了下小程序的请求方式大概和a ...

  2. 如何用NAnt管理单文件程序仓库

    因为学习C#各种特性和使用方法的需要,常常会编写和收集一些例子代码.一段时间之后,这种代码的数量就增加到无法通过简单粗暴的方式进行管理了.采用NAnt进行管理是一个不错的选择,虽然部分特性只有MSBu ...

  3. IE下css bug集合-翻译自haslayout.net

    概述IE浏览器以不支持大量的css 属性出名,同时也因其支持的css属性中存在大量bug. 本页列举了IE下的一些问题,实例样本和一些我们已知的解决方法. 尽管我已经尽力按照它们本来的性质对它们进行分 ...

  4. 7-11Zombie's Treasure Chest uva12325

    题意  你有一个体积为N的箱子和两种数量无限的宝物  宝物1的体积为s1 价值为v1   宝物2同理 输入均为32位带符号整数 你的任务是计算最多能带走多少价值的宝物 暴力枚举: 首先明白一点     ...

  5. python集合相关操作

    集合相关操作 集合是一个无序的,不重复的数据组合,它有着两个主要作用:去重以及关系测试. 去重指的是当把一个列表变成了集合,其中重复的内容就自动的被去掉了 关系测试指的是,测试两组数据之间的交集.差集 ...

  6. linux 输入设备驱动

    <输入子系统简介> a:背景 内核的输入子系统是对“分散的”,“多种不同类别”的输入设备(键盘,鼠标,跟踪杆,触摸屏,加速度计等)进行“统一处理”的驱动程序.具有如下特点: a-1:统一各 ...

  7. 常见的网络攻击(XSS,SQL注入,CSRF)

    一.XSS 二.SQL注入 三.CSRF

  8. java集合系列之LinkList

    概要  第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45) 第5部分 LinkedList示例 转载请注明出处 ...

  9. BZOJ4065 : [Cerc2012]Graphic Madness

    因为两棵树中间只有k条边,所以这些边一定要用到. 对于每棵树分别考虑: 如果一个点往下连着两个点,那么这个点往上的那条边一定不能用到. 如果一个点往下连着一个点,那么这个点往上的那条边一定不能用到. ...

  10. UVALive 6889 City Park 并查集

    City Park 题目连接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=122283#problem/F Description P ...