文章版权由作者李晓晖以及博客园共有,若转载请于大庭广众处于标明出处: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地图