Jackson 框架JSON、XML、List、Map直接相互转换

博客分类:

 

参考:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html

在其基础上做了稍微调整

详情见附件

jackson API文档:http://tool.oschina.net/apidocs/apidoc?api=jackson-1.9.9

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。

一、准备工作

pom.xml 里关联jar包如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.waegg</groupId>
  5. <artifactId>jacksonTest</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <dependencies>
  8. <dependency>
  9. <groupId>junit</groupId>
  10. <artifactId>junit</artifactId>
  11. <version>4.12</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.codehaus.jackson</groupId>
  15. <artifactId>jackson-mapper-asl</artifactId>
  16. <version>1.9.13</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>com.fasterxml.jackson.dataformat</groupId>
  20. <artifactId>jackson-dataformat-xml</artifactId>
  21. <version>2.7.1</version>
  22. </dependency>
  23. </dependencies>
  24. <packaging>war</packaging>
  25. </project>

二、Bean代码

AccountBean :

  1. package com.bugyun.pojo;
  2. public class AccountBean {
  3. private int id;
  4. private String name;
  5. private String email;
  6. private String address;
  7. private Birthday birthday;
  8. // getter、setter
  9. @Override
  10. public String toString() {
  11. return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;
  12. }
  13. public int getId() {
  14. return id;
  15. }
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public String getEmail() {
  26. return email;
  27. }
  28. public void setEmail(String email) {
  29. this.email = email;
  30. }
  31. public String getAddress() {
  32. return address;
  33. }
  34. public void setAddress(String address) {
  35. this.address = address;
  36. }
  37. public Birthday getBirthday() {
  38. return birthday;
  39. }
  40. public void setBirthday(Birthday birthday) {
  41. this.birthday = birthday;
  42. }
  43. }
Birthday:
  1. package com.bugyun.pojo;
  2. public class Birthday {
  3. private String birthday;
  4. public Birthday(String birthday) {
  5. super();
  6. this.birthday = birthday;
  7. }
  8. // getter、setter
  9. public Birthday() {
  10. }
  11. public String getBirthday() {
  12. return birthday;
  13. }
  14. public void setBirthday(String birthday) {
  15. this.birthday = birthday;
  16. }
  17. @Override
  18. public String toString() {
  19. return this.birthday;
  20. }
  21. }

三、测试代码

  1. package com.bugyun.test;
  2. import java.io.IOException;
  3. import java.io.StringWriter;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Set;
  10. import org.codehaus.jackson.JsonEncoding;
  11. import org.codehaus.jackson.JsonGenerationException;
  12. import org.codehaus.jackson.JsonGenerator;
  13. import org.codehaus.jackson.JsonParseException;
  14. import org.codehaus.jackson.map.JsonMappingException;
  15. import org.codehaus.jackson.map.ObjectMapper;
  16. import org.junit.After;
  17. import org.junit.Before;
  18. import org.junit.Test;
  19. import com.bugyun.pojo.AccountBean;
  20. import com.fasterxml.jackson.dataformat.xml.XmlMapper;
  21. /**
  22. * 项目名称:jacksonTest
  23. * 类名称:JacksonTest.java
  24. * 类描述:
  25. * 创建人:beyond
  26. * 创建时间:2016年2月24日 上午11:24:33
  27. * 修改人:
  28. * 修改时间:
  29. * 修改备注:
  30. * @version
  31. */
  32. public class JacksonTest {
  33. private JsonGenerator jsonGenerator = null;
  34. private ObjectMapper objectMapper = null;
  35. private AccountBean bean = null;
  36. @Before
  37. public void init() {
  38. bean = new AccountBean();
  39. bean.setAddress("js_wuxi");
  40. bean.setEmail("bugyun@hotmail.com");
  41. bean.setId(1);
  42. bean.setName("bugyun");
  43. objectMapper = new ObjectMapper();
  44. try {
  45. jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. @After
  51. public void destory() {
  52. try {
  53. if (jsonGenerator != null) {
  54. jsonGenerator.flush();
  55. }
  56. if (!jsonGenerator.isClosed()) {
  57. jsonGenerator.close();
  58. }
  59. jsonGenerator = null;
  60. objectMapper = null;
  61. bean = null;
  62. System.gc();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. /**
  68. *
  69. * @description: JavaBean(Entity/Model)转换成JSON
  70. *      上面分别利用JsonGenerator的writeObject方法和ObjectMapper的writeValue方法完成对Java对象的转换,二者传递的参数及构造的方式不同;
  71. *      JsonGenerator的创建依赖于ObjectMapper对象。
  72. *      也就是说如果你要使用JsonGenerator来转换JSON,那么你必须创建一个ObjectMapper。
  73. *      但是你用ObjectMapper来转换JSON,则不需要JSONGenerator。objectMapper的writeValue方法可以将一个Java对象转换成JSON。
  74. *      这个方法的参数一,需要提供一个输出流,转换后可以通过这个流来输出转换后的内容。
  75. *      或是提供一个File,将转换后的内容写入到File中。当然,这个参数也可以接收一个JSONGenerator,然后通过JSONGenerator来输出转换后的信息。
  76. *      第二个参数是将要被转换的Java对象。如果用三个参数的方法,那么是一个Config。
  77. *      这个config可以提供一些转换时的规则,过指定的Java对象的某些属性进行过滤或转换等。
  78. *
  79. *      输出:
  80. *          jsonGenerator   {"id":1,"name":"bugyun","email":"bugyun@hotmail.com","address":"js_wuxi","birthday":null}
  81. *          ObjectMapper    {"id":1,"name":"bugyun","email":"bugyun@hotmail.com","address":"js_wuxi","birthday":null}
  82. * @return void
  83. * @throws
  84. * @author beyond
  85. * @data:2016年2月24日上午11:34:53
  86. */
  87. @Test
  88. public void writeEntityJSON() {
  89. try {
  90. System.out.println("jsonGenerator");
  91. jsonGenerator.writeObject(bean);
  92. System.out.println("\nObjectMapper");
  93. objectMapper.writeValue(System.out, bean);
  94. } catch (IOException e) {
  95. e.printStackTrace();
  96. }
  97. }
  98. /**
  99. * @description: 将Map集合转换成Json字符串
  100. *      输出:
  101. *          jsonGenerator   {"name":"bugyun","account":{"id":1,"name":"bugyun","email":"bugyun@hotmail.com","address":"js_wuxi","birthday":null}}
  102. *          ObjectMapper    {"name":"bugyun","account":{"id":1,"name":"bugyun","email":"bugyun@hotmail.com","address":"js_wuxi","birthday":null}}
  103. * @return void
  104. * @throws
  105. * @author beyond
  106. * @data:2016年2月24日上午11:41:48
  107. */
  108. @Test
  109. public void writeMapJSON() {
  110. try {
  111. Map<String, Object> map = new HashMap<String, Object>();
  112. map.put("name", bean.getName());
  113. map.put("account", bean);
  114. System.out.println("jsonGenerator");
  115. jsonGenerator.writeObject(map);
  116. System.out.println("\n ObjectMapper");
  117. objectMapper.writeValue(System.out, map);
  118. } catch (IOException e) {
  119. e.printStackTrace();
  120. }
  121. }
  122. /**
  123. *
  124. * @description: 将List集合转换成json
  125. *  外面就是多了个[]中括号;同样Array也可以转换,转换的JSON和上面的结果是一样的
  126. *    输出:
  127. *      jsonGenerator   [{"id":1,"name":"bugyun","email":"bugyun@hotmail.com","address":"js_wuxi","birthday":null}]
  128. *      ObjectMapper    1###[{"id":1,"name":"bugyun","email":"bugyun@hotmail.com","address":"js_wuxi","birthday":null}]
  129. *                      2###[{"id":1,"name":"bugyun","email":"bugyun@hotmail.com","address":"js_wuxi","birthday":null}]
  130. * @return void
  131. * @throws
  132. * @author beyond
  133. * @data:2016年2月24日上午11:46:41
  134. */
  135. @Test
  136. public void writeListJSON() {
  137. try {
  138. List<AccountBean> list = new ArrayList<AccountBean>();
  139. list.add(bean);
  140. System.out.println("jsonGenerator");
  141. jsonGenerator.writeObject(list);
  142. System.out.println("\nObjectMapper");
  143. System.out.println("1###" + objectMapper.writeValueAsString(list));
  144. System.out.print("2###");
  145. objectMapper.writeValue(System.out, list);
  146. } catch (IOException e) {
  147. e.printStackTrace();
  148. }
  149. }
  150. /**
  151. * @description: 复杂的Java类型的JSON转换
  152. *      输出:
  153. *          {"user":{"name":"jackson","sex":true,"age":22},"infos":[22,"this is array"]}
  154. *          {"user":{"id":1,"name":"haha","email":"email","address":"address","birthday":null},"infos":["a","b","c"]}
  155. * @return void
  156. * @throws
  157. * @author beyond
  158. * @data:2016年2月24日下午1:08:06
  159. */
  160. @Test
  161. public void writeOthersJSON() {
  162. try {
  163. String[] arr = { "a", "b", "c" };
  164. //Object
  165. jsonGenerator.writeStartObject();//{
  166. jsonGenerator.writeObjectFieldStart("user");//user:{
  167. jsonGenerator.writeStringField("name", "jackson");//name:jackson
  168. jsonGenerator.writeBooleanField("sex", true);//sex:true
  169. jsonGenerator.writeNumberField("age", 22);//age:22
  170. jsonGenerator.writeEndObject();//}
  171. jsonGenerator.writeArrayFieldStart("infos");//infos:[
  172. jsonGenerator.writeNumber(22);//22
  173. jsonGenerator.writeString("this is array");//this is array
  174. jsonGenerator.writeEndArray();//]
  175. jsonGenerator.writeEndObject();//}
  176. //          ********************************************
  177. AccountBean bean = new AccountBean();
  178. bean.setAddress("address");
  179. bean.setEmail("email");
  180. bean.setId(1);
  181. bean.setName("haha");
  182. jsonGenerator.writeStartObject();//{
  183. jsonGenerator.writeObjectField("user", bean);//user:{bean}
  184. jsonGenerator.writeObjectField("infos", arr);//infos:[array]
  185. jsonGenerator.writeEndObject();//}
  186. } catch (Exception e) {
  187. e.printStackTrace();
  188. }
  189. }
  190. /**
  191. * @description: 将json字符串转换成JavaBean对象
  192. *      用到了ObjectMapper这个对象的readValue这个方法,这个方法需要提供2个参数。
  193. *      第一个参数就是解析的JSON字符串,
  194. *      第二个参数是将这个JSON解析持什么Java对象,Java对象的类型。当然,还有其他相同签名方法。
  195. *
  196. *      输出:
  197. *          haha
  198. *          haha#1#address#null#email
  199. * @return void
  200. * @throws
  201. * @author beyond
  202. * @data:2016年2月24日下午3:37:50
  203. */
  204. @Test
  205. public void readJson2Entity() {
  206. String json = "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}";
  207. try {
  208. AccountBean acc = objectMapper.readValue(json, AccountBean.class);
  209. System.out.println(acc.getName());
  210. System.out.println(acc);
  211. } catch (JsonParseException e) {
  212. e.printStackTrace();
  213. } catch (JsonMappingException e) {
  214. e.printStackTrace();
  215. } catch (IOException e) {
  216. e.printStackTrace();
  217. }
  218. }
  219. /**
  220. * @description: json字符串转换成list<map>
  221. *      输出:
  222. *          address:address2
  223. *          name:haha2
  224. *          id:2
  225. *          email:email2
  226. *          address:address
  227. *          name:haha
  228. *          id:1
  229. *          email:email
  230. * @return void
  231. * @throws
  232. * @author beyond
  233. * @data:2016年2月25日下午4:39:39
  234. */
  235. @Test
  236. public void readJson2List() {
  237. String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"
  238. + "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]";
  239. try {
  240. List<Map<String, Object>> list = objectMapper.readValue(json, List.class);
  241. //          System.out.println(list.size());
  242. for (int i = 0; i < list.size(); i++) {
  243. Map<String, Object> map = list.get(i);
  244. Set<String> set = map.keySet();
  245. for (Iterator it = set.iterator(); it.hasNext();) {
  246. String key = (String) it.next();
  247. System.out.println(key + ":" + map.get(key));
  248. }
  249. }
  250. } catch (JsonParseException e) {
  251. e.printStackTrace();
  252. } catch (JsonMappingException e) {
  253. e.printStackTrace();
  254. } catch (IOException e) {
  255. e.printStackTrace();
  256. }
  257. }
  258. /**
  259. *
  260. * @description: json字符串转换成Array
  261. *      输出:
  262. *          haha2#2#address2#null#email2
  263. *          haha#1#address#null#email
  264. * @return void
  265. * @throws
  266. * @author beyond
  267. * @data:2016年2月25日下午4:44:09
  268. */
  269. @Test
  270. public void readJson2Array() {
  271. String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"
  272. + "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]";
  273. try {
  274. AccountBean[] arr = objectMapper.readValue(json, AccountBean[].class);
  275. //          System.out.println(arr.length);
  276. for (int i = 0; i < arr.length; i++) {
  277. System.out.println(arr[i]);
  278. }
  279. } catch (JsonParseException e) {
  280. e.printStackTrace();
  281. } catch (JsonMappingException e) {
  282. e.printStackTrace();
  283. } catch (IOException e) {
  284. e.printStackTrace();
  285. }
  286. }
  287. /**
  288. *
  289. * @description: json字符串转换Map集合
  290. *      输出:
  291. *          success:true
  292. *          A:{address=address2, name=haha2, id=2, email=email2}
  293. *          B:{address=address, name=haha, id=1, email=email}
  294. * @return void
  295. * @throws
  296. * @author beyond
  297. * @data:2016年2月25日下午4:48:40
  298. */
  299. @Test
  300. public void readJson2Map() {
  301. String json = "{\"success\":true,\"A\":{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"
  302. + "\"B\":{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}}";
  303. try {
  304. Map<String, Map<String, Object>> maps = objectMapper.readValue(json, Map.class);
  305. //          System.out.println(maps.size());
  306. Set<String> key = maps.keySet();
  307. Iterator<String> iter = key.iterator();
  308. while (iter.hasNext()) {
  309. String field = iter.next();
  310. System.out.println(field + ":" + maps.get(field));
  311. }
  312. } catch (JsonParseException e) {
  313. e.printStackTrace();
  314. } catch (JsonMappingException e) {
  315. e.printStackTrace();
  316. } catch (IOException e) {
  317. e.printStackTrace();
  318. }
  319. }
  320. /**
  321. * @description: java Object 转换为 xml
  322. *      输出:
  323. *          <ArrayList xmlns=""><item><id>1</id><name>bugyun</name><email>bugyun@hotmail.com</email><address>js_wuxi</address><birthday/></item></ArrayList>
  324. *          <HashMap xmlns=""><A><id>1</id><name>bugyun</name><email>bugyun@hotmail.com</email><address>js_wuxi</address><birthday/></A></HashMap>
  325. * @return void
  326. * @throws
  327. * @author beyond
  328. * @data:2016年2月26日上午9:20:49
  329. */
  330. @Test
  331. public void writeObject2Xml() {
  332. XmlMapper xml = new XmlMapper();
  333. try {
  334. //javaBean转换成xml
  335. //xml.writeValue(System.out, bean);
  336. StringWriter sw = new StringWriter();
  337. xml.writeValue(sw, bean);
  338. //          System.out.println(sw.toString());
  339. //          List转换成xml
  340. List<AccountBean> list = new ArrayList<AccountBean>();
  341. list.add(bean);
  342. System.out.println(xml.writeValueAsString(list));
  343. //          Map转换xml文档
  344. Map<String, AccountBean> map = new HashMap<String, AccountBean>();
  345. map.put("A", bean);
  346. System.out.println(xml.writeValueAsString(map));
  347. } catch (JsonGenerationException e) {
  348. e.printStackTrace();
  349. } catch (JsonMappingException e) {
  350. e.printStackTrace();
  351. } catch (IOException e) {
  352. e.printStackTrace();
  353. }
  354. }
  355. }

引用原文:http://bugyun.iteye.com/blog/2278997

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权。希望尽自己的努力,做到更好,大家一起努力进步!

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

上一篇:查看Wii的系统版本信息


下一篇:P1006 传纸条 多维DP