Jackson 框架,轻易转换JSON

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html

相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。

**一、**准备工作

1、 下载依赖库jar包

Jackson的jar all下载地址:http://jackson.codehaus.org/1.7.6/jackson-all-1.7.6.jar

然后在工程中导入这个jar包即可开始工作

官方示例:http://wiki.fasterxml.com/JacksonInFiveMinutes

因为下面的程序是用junit测试用例运行的,所以还得添加junit的jar包。版本是junit-4.2.8

如果你需要转换xml,那么还需要stax2-api.jar

2、 测试类基本代码如下

1package com.hoo.test; 2 3import java.io.IOException; 4 5import java.io.StringWriter; 6 7import java.util.ArrayList; 8 9import java.util.HashMap; 10 11import java.util.Iterator; 12 13import java.util.LinkedHashMap; 14 15import java.util.List; 16 17import java.util.Map; 18 19import java.util.Set; 20 21import org.codehaus.jackson.JsonEncoding; 22 23import org.codehaus.jackson.JsonGenerationException; 24 25import org.codehaus.jackson.JsonGenerator; 26 27import org.codehaus.jackson.JsonParseException; 28 29import org.codehaus.jackson.map.JsonMappingException; 30 31import org.codehaus.jackson.map.ObjectMapper; 32 33import org.codehaus.jackson.node.JsonNodeFactory; 34 35import org.codehaus.jackson.xml.XmlMapper; 36 37import org.junit.After; 38 39import org.junit.Before; 40 41import org.junit.Test; 42 43import com.hoo.entity.AccountBean; 44 45/** 46 47 * <b>function:</b>Jackson 将java对象转换成JSON字符串,也可以将JSON字符串转换成java对象 48 49 * jar-lib-version: jackson-all-1.6.2 50 51 * jettison-1.0.1 52 53 * @author hoojo 54 55 * @createDate 2010-11-23 下午04:54:53 56 57 * @file JacksonTest.java 58 59 * @package com.hoo.test 60 61 * @project Spring3 62 63 * @blog http://blog.csdn.net/IBM_hoojo 64 65 * @email hoojo_@126.com 66 67 * @version 1.0 68 69 */ 70 71@SuppressWarnings("unchecked") 72 73public class JacksonTest { 74 75private JsonGenerator jsonGenerator = null; 76 77private ObjectMapper objectMapper = null; 78 79private AccountBean bean = null; 80 81@Before 82 83public void init() { 84 85bean = new AccountBean(); 86 87bean.setAddress("china-Guangzhou"); 88 89bean.setEmail("hoojo_@126.com"); 90 91bean.setId(1); 92 93bean.setName("hoojo"); 94 95objectMapper = new ObjectMapper(); 96 97try { 98 99jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8); 100 101} catch (IOException e) { 102 103e.printStackTrace(); 104 105} 106 107} 108 109@After 110 111public void destory() { 112 113try { 114 115if (jsonGenerator != null) { 116 117jsonGenerator.flush(); 118 119} 120 121if (!jsonGenerator.isClosed()) { 122 123jsonGenerator.close(); 124 125} 126 127jsonGenerator = null; 128 129objectMapper = null; 130 131bean = null; 132 133System.gc(); 134 135} catch (IOException e) { 136 137e.printStackTrace(); 138 139} 140 141} 142 143}

3、 所需要的JavaEntity

1package com.hoo.entity; 2 3public class AccountBean { 4 5private int id; 6 7private String name; 8 9private String email; 10 11private String address; 12 13private Birthday birthday; 14 15//getter、setter 16 17@Override 18 19public String toString() { 20 21return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email; 22 23} 24 25}

Birthday

1package com.hoo.entity; 2 3public class Birthday { 4 5private String birthday; 6 7public Birthday(String birthday) { 8 9super(); 10 11this.birthday = birthday; 12 13} 14 15//getter、setter 16 17public Birthday() {} 18 19@Override 20 21public String toString() { 22 23return this.birthday; 24 25} 26 27}

二、Java对象转换成****JSON

1、 JavaBean(Entity/Model)转换成JSON

1/** 2 3 * <b>function:</b>将java对象转换成json字符串 4 5 * @author hoojo 6 7 * @createDate 2010-11-23 下午06:01:10 8 9 */ 10 11@Test 12 13public void writeEntityJSON() { 14 15try { 16 17System.out.println("jsonGenerator"); 18 19//writeObject可以转换java对象,eg:JavaBean/Map/List/Array等 20 21jsonGenerator.writeObject(bean); 22 23System.out.println(); 24 25System.out.println("ObjectMapper"); 26 27//writeValue具有和writeObject相同的功能 28 29objectMapper.writeValue(System.out, bean); 30 31} catch (IOException e) { 32 33e.printStackTrace(); 34 35} 36 37}

运行后结果如下:

1jsonGenerator 2 3{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"} 4 5ObjectMapper 6 7{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}

上面分别利用JsonGenerator的writeObject方法和ObjectMapper的writeValue方法完成对Java对象的转换,二者传递的参数及构造的方式不同;JsonGenerator的创建依赖于ObjectMapper对象。也就是说如果你要使用JsonGenerator来转换JSON,那么你必须创建一个ObjectMapper。但是你用ObjectMapper来转换JSON,则不需要JSONGenerator。

objectMapper的writeValue方法可以将一个Java对象转换成JSON。这个方法的参数一,需要提供一个输出流,转换后可以通过这个流来输出转换后的内容。或是提供一个File,将转换后的内容写入到File中。当然,这个参数也可以接收一个JSONGenerator,然后通过JSONGenerator来输出转换后的信息。第二个参数是将要被转换的Java对象。如果用三个参数的方法,那么是一个Config。这个config可以提供一些转换时的规则,过指定的Java对象的某些属性进行过滤或转换等。

2、 将Map集合转换成Json字符串

1/** 2 3 * <b>function:</b>将map转换成json字符串 4 5 * @author hoojo 6 7 * @createDate 2010-11-23 下午06:05:26 8 9 */ 10 11@Test 12 13public void writeMapJSON() { 14 15try { 16 17Map<String, Object> map = new HashMap<String, Object>(); 18 19map.put("name", bean.getName()); 20 21map.put("account", bean); 22 23bean = new AccountBean(); 24 25bean.setAddress("china-Beijin"); 26 27bean.setEmail("hoojo@qq.com"); 28 29map.put("account2", bean); 30 31System.out.println("jsonGenerator"); 32 33jsonGenerator.writeObject(map); 34 35System.out.println(""); 36 37System.out.println("objectMapper"); 38 39objectMapper.writeValue(System.out, map); 40 41} catch (IOException e) { 42 43e.printStackTrace(); 44 45} 46 47}

转换后结果如下:

1jsonGenerator 2 3{"account2":{"address":"china-Beijin","name":null,"id":0,"birthday":null,"email":"hoojo@qq.com"},"name":"hoojo", 4 5"account":{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}} 6 7objectMapper 8 9{"account2":{"address":"china-Beijin","name":null,"id":0,"birthday":null,"email":"hoojo@qq.com"},"name":"hoojo", 10 11"account":{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}}

3、 将List集合转换成json

1/** 2 3 * <b>function:</b>将list集合转换成json字符串 4 5 * @author hoojo 6 7 * @createDate 2010-11-23 下午06:05:59 8 9 */ 10 11@Test 12 13public void writeListJSON() { 14 15try { 16 17List<AccountBean> list = new ArrayList<AccountBean>(); 18 19list.add(bean); 20 21bean = new AccountBean(); 22 23bean.setId(2); 24 25bean.setAddress("address2"); 26 27bean.setEmail("email2"); 28 29bean.setName("haha2"); 30 31list.add(bean); 32 33System.out.println("jsonGenerator"); 34 35//list转换成JSON字符串 36 37jsonGenerator.writeObject(list); 38 39System.out.println(); 40 41System.out.println("ObjectMapper"); 42 43//用objectMapper直接返回list转换成的JSON字符串 44 45System.out.println("1###" + objectMapper.writeValueAsString(list)); 46 47System.out.print("2###"); 48 49//objectMapper list转换成JSON字符串 50 51objectMapper.writeValue(System.out, list); 52 53} catch (IOException e) { 54 55e.printStackTrace(); 56 57} 58 59}

结果如下:

1jsonGenerator 2 3[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}, 4 5{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}] 6 7ObjectMapper 8 91###[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}, 10 11{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}] 12 132###[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}, 14 15{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]

外面就是多了个[]中括号;同样Array也可以转换,转换的JSON和上面的结果是一样的,这里就不再转换了。.

4、下面来看看jackson提供的一些类型,用这些类型完成json转换;如果你使用这些类型转换JSON的话,那么你即使没有JavaBean(Entity)也可以完成复杂的Java类型的JSON转换。下面用到这些类型构建一个复杂的Java对象,并完成JSON转换。

1@Test 2 3public void writeOthersJSON() { 4 5try { 6 7String[] arr = { "a", "b", "c" }; 8 9System.out.println("jsonGenerator"); 10 11String str = "hello world jackson!"; 12 13//byte 14 15jsonGenerator.writeBinary(str.getBytes()); 16 17//boolean 18 19jsonGenerator.writeBoolean(true); 20 21//null 22 23jsonGenerator.writeNull(); 24 25//float 26 27jsonGenerator.writeNumber(2.2f); 28 29//char 30 31jsonGenerator.writeRaw("c"); 32 33//String 34 35jsonGenerator.writeRaw(str, 5, 10); 36 37//String 38 39jsonGenerator.writeRawValue(str, 5, 5); 40 41//String 42 43jsonGenerator.writeString(str); 44 45jsonGenerator.writeTree(JsonNodeFactory.instance.POJONode(str)); 46 47System.out.println(); 48 49//Object 50 51jsonGenerator.writeStartObject();//{ 52 53jsonGenerator.writeObjectFieldStart("user");//user:{ 54 55jsonGenerator.writeStringField("name", "jackson");//name:jackson 56 57jsonGenerator.writeBooleanField("sex", true);//sex:true 58 59jsonGenerator.writeNumberField("age", 22);//age:22 60 61jsonGenerator.writeEndObject();//} 62 63jsonGenerator.writeArrayFieldStart("infos");//infos:[ 64 65jsonGenerator.writeNumber(22);//22 66 67jsonGenerator.writeString("this is array");//this is array 68 69jsonGenerator.writeEndArray();//] 70 71jsonGenerator.writeEndObject();//} 72 73AccountBean bean = new AccountBean(); 74 75bean.setAddress("address"); 76 77bean.setEmail("email"); 78 79bean.setId(1); 80 81bean.setName("haha"); 82 83//complex Object 84 85jsonGenerator.writeStartObject();//{ 86 87jsonGenerator.writeObjectField("user", bean);//user:{bean} 88 89jsonGenerator.writeObjectField("infos", arr);//infos:[array] 90 91jsonGenerator.writeEndObject();//} 92 93} catch (Exception e) { 94 95e.printStackTrace(); 96 97} 98 99}

运行后,结果如下:

1jsonGenerator 2 3"aGVsbG8gd29ybGQgamFja3NvbiE=" true null 2.2c world jac worl "hello world jackson!" "hello world jackson!" 4 5{"user":{"name":"jackson","sex":true,"age":22},"infos":[22,"this is array"]} 6 7{"user":{"address":"address","name":"haha","id":1,"birthday":null,"email":"email"},"infos":["a","b","c"]}

怎么样?构造的json字符串和输出的结果是一致的吧。关键看懂用JSONGenerator提供的方法,完成一个Object的构建。

三、JSON转换成Java对象

1、 将json字符串转换成JavaBean对象

1@Test 2 3public void readJson2Entity() { 4 5String json = "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}"; 6 7try { 8 9AccountBean acc = objectMapper.readValue(json, AccountBean.class); 10 11System.out.println(acc.getName()); 12 13System.out.println(acc); 14 15} catch (JsonParseException e) { 16 17e.printStackTrace(); 18 19} catch (JsonMappingException e) { 20 21e.printStackTrace(); 22 23} catch (IOException e) { 24 25e.printStackTrace(); 26 27} 28 29}

很简单,用到了ObjectMapper这个对象的readValue这个方法,这个方法需要提供2个参数。第一个参数就是解析的JSON字符串,第二个参数是即将将这个JSON解析吃什么Java对象,Java对象的类型。当然,还有其他相同签名方法,如果你有兴趣可以一一尝试使用方法,当然使用的方法和当前使用的方法大同小异。运行后,结果如下:

1haha 2 3haha#1#address#null#email

2、 将json字符串转换成List<Map>集合

1/** 2 3 * <b>function:</b>json字符串转换成list<map> 4 5 * @author hoojo 6 7 * @createDate 2010-11-23 下午06:12:01 8 9 */ 10 11@Test 12 13public void readJson2List() { 14 15String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+ 16 17"{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]"; 18 19try { 20 21List<LinkedHashMap<String, Object>> list = objectMapper.readValue(json, List.class); 22 23System.out.println(list.size()); 24 25for (int i = 0; i < list.size(); i++) { 26 27Map<String, Object> map = list.get(i); 28 29Set<String> set = map.keySet(); 30 31for (Iterator<String> it = set.iterator();it.hasNext();) { 32 33String key = it.next(); 34 35System.out.println(key + ":" + map.get(key)); 36 37} 38 39} 40 41} catch (JsonParseException e) { 42 43e.printStackTrace(); 44 45} catch (JsonMappingException e) { 46 47e.printStackTrace(); 48 49} catch (IOException e) { 50 51e.printStackTrace(); 52 53} 54 55}

尝试过将上面的JSON转换成List,然后List中存放AccountBean,但结果失败了。但是支持Map集合。因为你转成List.class,但是不知道List存放何种类型。只好默然Map类型。因为所有的对象都可以转换成Map结合,运行后结果如下:

12 2 3address:address2 4 5name:haha2 6 7id:2 8 9email:email2 10 11address:address 12 13name:haha 14 15id:1 16 17email:email

3、 Json字符串转换成Array数组,由于上面的泛型转换不能识别到集合中的对象类型。所有这里用对象数组,可以解决这个问题。只不过它不再是集合,而是一个数组。当然这个不重要,你可以用Arrays.asList将其转换成List即可。

1/** 2 3 * <b>function:</b>json字符串转换成Array 4 5 * @author hoojo 6 7 * @createDate 2010-11-23 下午06:14:01 8 9 */ 10 11@Test 12 13public void readJson2Array() { 14 15String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+ 16 17"{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]"; 18 19try { 20 21AccountBean[] arr = objectMapper.readValue(json, AccountBean[].class); 22 23System.out.println(arr.length); 24 25for (int i = 0; i < arr.length; i++) { 26 27System.out.println(arr[i]); 28 29} 30 31} catch (JsonParseException e) { 32 33e.printStackTrace(); 34 35} catch (JsonMappingException e) { 36 37e.printStackTrace(); 38 39} catch (IOException e) { 40 41e.printStackTrace(); 42 43} 44 45}

运行后的结果:

12 2 3haha2#2#address2#null#email2 4 5haha#1#address#null#email

4、 Json字符串转换成Map集合

1/** 2 3 * <b>function:</b>json字符串转换Map集合 4 5 * @author hoojo 6 7 * @createDate Nov 27, 2010 3:00:06 PM 8 9 */ 10 11@Test 12 13public void readJson2Map() { 14 15String json = "{\"success\":true,\"A\":{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+ 16 17"\"B\":{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}}"; 18 19try { 20 21Map<String, Map<String, Object>> maps = objectMapper.readValue(json, Map.class); 22 23System.out.println(maps.size()); 24 25Set<String> key = maps.keySet(); 26 27Iterator<String> iter = key.iterator(); 28 29while (iter.hasNext()) { 30 31String field = iter.next(); 32 33System.out.println(field + ":" + maps.get(field)); 34 35} 36 37} catch (JsonParseException e) { 38 39e.printStackTrace(); 40 41} catch (JsonMappingException e) { 42 43e.printStackTrace(); 44 45} catch (IOException e) { 46 47e.printStackTrace(); 48 49} 50 51}

运行后结果如下:

13 2 3success:true 4 5A:{address=address2, name=haha2, id=2, email=email2} 6 7B:{address=address, name=haha, id=1, email=email}

四、JacksonXML的支持

Jackson也可以完成java对象到xml的转换,转换后的结果要比json-lib更直观,不过它依赖于stax2-api.jar这个jar包。

1/** 2 3 * <b>function:</b>java对象转换成xml文档 4 5 * 需要额外的jar包 stax2-api.jar 6 7 * @author hoojo 8 9 * @createDate 2010-11-23 下午06:11:21 10 11 */ 12 13@Test 14 15public void writeObject2Xml() { 16 17//stax2-api-3.0.2.jar 18 19System.out.println("XmlMapper"); 20 21XmlMapper xml = new XmlMapper(); 22 23try { 24 25//javaBean转换成xml 26 27//xml.writeValue(System.out, bean); 28 29StringWriter sw = new StringWriter(); 30 31xml.writeValue(sw, bean); 32 33System.out.println(sw.toString()); 34 35//List转换成xml 36 37List<AccountBean> list = new ArrayList<AccountBean>(); 38 39list.add(bean); 40 41list.add(bean); 42 43System.out.println(xml.writeValueAsString(list)); 44 45//Map转换xml文档 46 47Map<String, AccountBean> map = new HashMap<String, AccountBean>(); 48 49map.put("A", bean); 50 51map.put("B", bean); 52 53System.out.println(xml.writeValueAsString(map)); 54 55} catch (JsonGenerationException e) { 56 57e.printStackTrace(); 58 59} catch (JsonMappingException e) { 60 61e.printStackTrace(); 62 63} catch (IOException e) { 64 65e.printStackTrace(); 66 67} 68 69}

运行上面的方法,结果如下:

1XmlMapper 2 3<unknown><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></unknown> 4 5<unknown><unknown><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></unknown> 6 7<email><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></email></unknown> 8 9<unknown><A><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></A> 10 11<B><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></B></unknown>

看结果,根节点都是unknown 这个问题还没有解决,由于根节点没有转换出来,所有导致解析xml到Java对象,也无法完成。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )