龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Jackson的用法实例分析(2)

时间:2014-08-07 15:51来源:网络整理 作者:网络 点击:
分享到:
此方法同样可以得到上面方法的值。但是注意此方法中的这个函数:createJsonGenerator(),它需要两个参数,一个是OutputStream类型参数,一个是JsonEncoding类

此方法同样可以得到上面方法的值。但是注意此方法中的这个函数:createJsonGenerator(),它需要两个参数,一个是OutputStream类型参数,一个是JsonEncoding类型参数。通过这两个参数,我们可以了解到,此方法不仅可以将Json直接写入网络流,还可以将Json写入文件流或者内存流。所以用途更广。

2. 反序列化

①一次性反序列化

此方法中主要利用ObjectMapper提供的<testJsonClass> readValue(String content, Class<testJsonClass> valueType)方法。此方法需要输入Json串以及对应的需要填充的类的Class,返回填充后的类。
将Json串解析到自定义类中

当Json串为:

String test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"

的时候。

首先自定义一个类:

public class testJsonClass
 {
    public int objectID;
    public List geoPoints=new ArrayList();
}

然后利用下面段代码将Json反序列化到此类中:

testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);

利用

System.out.println(testClass.objectID);
System.out.println(testClass.geoPoints)

可以在控制台上看到输出的值为:

357
[{x=504604.59802246094, y=305569.9150390625}]

将Json串反序列化到系统自带的类中
当Json串是

String json = "{"error":0,"data":{"name":"ABC","age":20,"phone":{"home":"abc","mobile":"def"},"friends":[{"name":"DEF","phone":{"home":"hij","mobile":"klm"}},{"name":"GHI","phone":{"home":"nop","mobile":"qrs"}}]},"other":{"nickname":[]}}"。

用系统自带的Map定义一个变量:Map<String, Map<String, Object>>  maps。然后利用maps = objectMapper.readValue(json, Map.class)便可将Json反序列化到变量maps中。
通过

System.out.println(maps.get("error"));
System.out.println((Object)(maps.get("data").get("phone")))

可在控制台中得到下面的结果:

0
{home=abc, mobile=def}

②渐次反序列化

此方法更灵活,可以只将用户感兴趣的Json串信息值提取出来。主要利用ObjectMapper提供的readTree和Jackson提供的JsonNode类来实现。

测试例子

String test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";

此Json串比较复杂,包含了嵌套数组的形式,具有通用性。

实现反序列化

JsonNode node= objectMapper.readTree(test);   //将Json串以树状结构读入内存
JsonNode contents=node.get("results");//得到results这个节点下的信息
for(int i=0;i<contents.size();i++) //遍历results下的信息,size()函数可以得节点所包含的的信息的个数,类似于数组的长度
{
System.out.println(contents.get(i).get("objectID").getIntValue()); //读取节点下的某个子节点的值
JsonNode geoNumber=contents.get(i).get("geoPoints");
for(int j=0;j<geoNumber.size();j++)   //循环遍历子节点下的信息
{
System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" "+geoNumber.get(j).get("y").getDoubleValue());
}
}

在控制台下输出的结果是:

357
504604.59802246094 305569.9150390625
358
504602.2680053711 305554.43603515625

结论:

此方法类似于XML解析中的DOM方式解析,其好处是结构明细,便于提取想要的信息。当然,其缺点也和此方法一样:耗时费空间。

三.总结

Jackson关于Json的操作主要如上所示,其方法使用起来很便利,而且也很灵活,即提供了一次性完成的操作,也提供了可以按需读取信息的操作。并且Jackson的功能很齐全,可以对序列化和反序列化进行多种细节的控制,例如注解功能和对于Hibernate的延迟注入功能以及设置时间格式功能等,因为这些功能目前不太需要,所以仔细研究留待以后。同时,Jackson还支持对XML的一系列序列化和反序列化的操作,其思路与解析Json的大致相同。
对于Jackson目前的缺点,网上有人测试所比Json-lib更占内存一些。而利用空间换时间,一般是值得的。

精彩图集

赞助商链接