文章版权由作者李晓晖及博客园共有,若转载请于大庭广众处于标明出处:http://www.cnblogs.com/naaoveGIS/。

1简介

Jackson有比强之序列化和倒序列化效率,据测试,无论是哪种形式之转换,Jackson
> Gson >
Json-lib,而且Jackson的拍卖能力还是大出Json-lib近10加倍左右,且不易也特别大。相比之下,Json-lib似乎已住更新,最新的本为是基于JDK15,而Jackson的社区虽然比较活跃。

下面,结合实例来针对Jackson的用法进行简易介绍。

2使用

Jackson提供了不少看似及方,而以序列化和倒序列化中行使的最多的接近则是ObjectMapper这个仿佛,此类比较相近于Json-lib中JsonObject和ArrayObject。此类中提供了readTree(),readValue(),writeValueAsString()等方法用于转移。具体有关此类的证实文档地址是:http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html。

为了避免双重描述,下面被所涉嫌到之objectMapper均是来至于ObjectMapper
objectMapper = new
ObjectMapper()。下面用按照序列化和倒序列化两个点来大概介绍用法。

2.1序列化

2.1.1 对java于带类进行序列化

2.1.1.1测试例子

List list=new ArrayList();

list.add(1);

list.add(2);

list.add(3);

2.1.1.2贯彻序列化

String teststringlist=objectMapper.writeValueAsString(list);

System.out.println(teststringlist);

于控制高出口的结果是:

[1,2,3]

2.1.1.3结论

Jackson对一般品种的序列化是会简单实现的。

2.1.2 对从定义类的序列化

2.1.2.1测试例子

public class student {

private int age=10;

private String name=”hhh”;  

    public String[] list={“hao”,”haouhao”,”keyi”};

    public Date time=new Date();

         public int getAge() {

                   return age;

         }

         public void setAge(int age) {

                   this.age = age;

         }

         public String getName() {

                   return name;

         }

         public void setName(String name) {

                   this.name = name;

         }

}

否使例子更有通用性,此类中富含了价值类型int,引用类型String,String[],还噙了日期类型Date。

2.1.2.2兑现序列化

student st=new student();

String teststringstu=objectMapper.writeValueAsString(st);

System.out.println(teststringstu);

当决定高出口的结果是:

{“list”:[“hao”,”haouhao”,”keyi”],”time”:1375429228382,”name”:”hhh”,”age”:10}

2.1.2.3结论

通过输出,可见转换得到的Json串是入格式的。但是,时间之代表有接触不符合标准。下面用介绍对时格式的改。

2.1.3对时间格式的定义

Jackson有自己之默认时间格式,即timestamps形式,其效就是要齐结果所出示的(例如:1375429228382)。如果想装是格式是无效,通过objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS,
false)便可安装,这样用设日变化使用所谓的采取 [ISO-8601 ]-compliant
notation, 输出接近如下格式的时空: “1970-01-01T00:00:00.000+0000″。

自,也堪起定义输出的时刻格式。

2.1.3.1于定义时间格式的实现

事例还采取地方所介绍的student类。

student st=new student();

java.text.DateFormat myFormat = new
java.text.SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);

objectMapper.getSerializationConfig().setDateFormat(myFormat);

String teststringstu=objectMapper.writeValueAsString(st);

System.out.println(teststringstu);

控制台上输出的记过是:

{“list”:[“hao”,”haouhao”,”keyi”],”time”:”2013-08-02
03:48:20″,”name”:”hhh”,”age”:10}

2.1.3.2结论

看得出时间输出格式化为了咱怀念使的了。在Jackson中定义时间输出格式的计较在Json-lib中针对时格式的概念简便很多。

2.1.4 另一样种序列化方法

2.1.4.1落实序列化

所用例子还是是事先的student类。

student st=new student();

JsonGenerator jsonGenerator =
objectMapper.getJsonFactory().createJsonGenerator(System.out,
JsonEncoding.UTF8);

jsonGenerator.writeObject(st); 

System.out.println();

控制台上之出口结果是:

{“list”:[“hao”,”haouhao”,”keyi”],”time”:1375429228382,”name”:”hhh”,”age”:10}

2.1.4.2结论

此方式一致可以抱地方方法的价值。但是注意这办法被之此函数:createJsonGenerator(),它需简单只参数,一个凡OutputStream类型参数,一个是JsonEncoding类型参数。通过就简单只参数,我们可了解及,此道不仅可以以Json直接写副网络流,还好拿Json写副文件流或者内存流。所以用还普遍。

2.2 反序列化

2.2.1 一次性反序列化

其一道吃举足轻重行使ObjectMapper提供的<testJsonClass> readValue(String
content, Class<testJsonClass>
valueType)方法。此办法要输入Json错以及相应之消填写的类的Class,返回填充后的好像。

2.2.1.1以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}]

2.2.1.2 将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}

2.2.2逐渐蹩脚反序列化

这个道重复活,可以单独将用户感兴趣的Json串信息值提取出来。主要使用ObjectMapper提供的readTree和Jackson提供的JsonNode类来贯彻。

2.2.2.1测试例子

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

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

2.2.2.2落实反序列化

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

2.2.2.3结论

其一方法类似于XML解析被之DOM方式分析,其利益是组织致密,便于提取想使之信息。当然,其缺点也和是措施同样:耗时费空间。

3.总结

Jackson关于Json的操作主要要达到所示,其方式以起来老有益于,而且为非常灵巧,即提供了一次性就的操作,也提供了好遵循需要读取信息之操作。并且Jackson的职能十分齐全,可以对序列化和反序列化进行多种细节之支配,例如注解功能与于Hibernate的缓注入力量跟安装时间格式功能等,因为这些意义时不顶需要,所以仔细研究留待以后。同时,Jackson还支持针对XML的平等雨后春笋序列化和倒序列化的操作,其思路和解析Json的大致相同。

于Jackson目前底老毛病,网上有人测试所比Json-lib更占内存有。而下空间更换时间,一般是值得的。

                                                                             ———-欢迎转载,但保留版权,请以赫处标明出处:http://www.cnblogs.com/naaoveGIS/

相关文章

网站地图xml地图