ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。
Jackson学习一之对象与JSON互相转化
新建基本Student类:
1. package com.jingshou.pojo;
2.
3. import java.util.Date;
4.
5. public class Student {
6. private int id;
7. private String name;
8. private Date birthDay;
9.
10. public int getId() {
11. return id;
12. }
13.
14. public void setId(int id) {
15. this.id = id;
16. }
17.
18. public String getName() {
19. return name;
20. }
21.
22. public void setName(String name) {
23. this.name = name;
24. }
25.
26. public Date getBirthDay() {
27. return birthDay;
28. }
29.
30. public void setBirthDay(Date birthDay) {
31. this.birthDay = birthDay;
32. }
33.
34. @Override
35. public String toString() {
36. return "Student [birthDay=" + birthDay + ", id=" + id + ", name="
37. + name + "]";
38. }
39.
40. }
班级类:
1. package com.jingshou.pojo;
2.
3. import java.util.List;
4.
5. public class Class {
6. private String cname;
7. private List<Student> members;
8. public String getCname() {
9. return cname;
10. }
11. public void setCname(String cname) {
12. this.cname = cname;
13. }
14. public List<Student> getMembers() {
15. return members;
16. }
17. public void setMembers(List<Student> members) {
18. this.members = members;
19. }
20.
21. public String toString(){
22. return "The Class Name is: " + cname + " " + "The members are: " + members;
23.
24. }
25.
26.
27. }
测试代码:
1. package com.jingshou.jackson;
2.
3. import java.io.IOException;
4. import java.util.ArrayList;
5. import java.util.Date;
6. import java.util.List;
7.
8. import com.fasterxml.jackson.databind.ObjectMapper;
9. import com.jingshou.pojo.Class;
10. import com.jingshou.pojo.Student;
11.
12. public class JacksonTest1 {
13.
14. public static void main(String[] args) throws IOException {
15. Student student1 = new Student();
16. student1.setId(5237);
17. student1.setName("jingshou");
18. student1.setBirthDay(new Date());
19.
20. ObjectMapper mapper = new ObjectMapper();
21.
22. // Convert object to JSON string
23. String Json = mapper.writeValueAsString(student1);
24. System.out.println("Change Object to JSON String: " + Json);
25.
26. // Convert Json string to Object
27. Student student2 = mapper.readValue(Json, Student.class);
28. System.out.println(student2);
29.
30. // Create a student list add it to Bj
31. Student student3 = new Student();
32. student3.setId(5117);
33. student3.setName("saiya");
34. student3.setBirthDay(new Date());
35.
36. List<Student> stuList = new ArrayList<Student>();
37. stuList.add(student1);
38. stuList.add(student3);
39.
40. Class bj = new Class();
41. bj.setCname("五年二班");
42. bj.setMembers(stuList);
43.
44. String json2 = mapper.writeValueAsString(bj);
45. System.out.println("The JSON from Class is: " + json2);
46.
47. Class bj2 = mapper.readValue(json2, Class.class);
48. System.out.println(bj2);
49.
50.
51. }
52.
53. }
运行结果:
1. Change Object to JSON String: {"id":5237,"name":"jingshou","birthDay":1389513906622}
2. Student [birthDay=Sun Jan 12 16:05:06 CST 2014, id=5237, name=jingshou]
3. The JSON from Class is: {"cname":"五年二班","members":[{"id":5237,"name":"jingshou","birthDay":1389513906622},{"id":5117,"name":"saiya","birthDay":1389513906859}]}
4. The Class Name is: 五年二班 The members are: [Student [birthDay=Sun Jan 12 16:05:06 CST 2014, id=5237, name=jingshou], Student [birthDay=Sun Jan 12 16:05:06 CST 2014, id=5117, name=saiya]]
小结:
· 转换的关键就是ObjectMapper
· 在使用ObjectMapper对象readValue或者writeValue的时候,JSON可以以字符串的形式传入,也可以以文件的形式传入,官方的例子是让将JSON保存在文件中
· 明显JSON字串中的key与Java类中的field名字应该要相同
· Student类如果有自定义构造函数的时候,进行JSON->对象转换会出错,接下去再研究这个问题..
· Date域是以long类型输出的,有必要的话,需要进行格式转换
Jackson学习二之集合类对象与JSON互相转化
本篇主要演示如何使用Jackson对List, Map和数组与JSON互相转换.
1. package com.jingshou.jackson;
2.
3. import java.io.IOException;
4. import java.util.ArrayList;
5. import java.util.Arrays;
6. import java.util.Date;
7. import java.util.HashMap;
8. import java.util.List;
9. import java.util.Map;
10.
11. import com.fasterxml.jackson.databind.ObjectMapper;
12. import com.jingshou.pojo.Student;
13.
14. public class JacksonTest2 {
15.
16. public static void main(String[] args) throws IOException {
17. Student student1 = new Student();
18. student1.setId(5237);
19. student1.setName("jingshou");
20. student1.setBirthDay(new Date());
21.
22. Student student3 = new Student();
23. student3.setId(5117);
24. student3.setName("saiya");
25. student3.setBirthDay(new Date());
26.
27. ObjectMapper mapper = new ObjectMapper();
28.
29. //Convert between List and JSON
30. List<Student> stuList = new ArrayList<Student>();
31. stuList.add(student1);
32. stuList.add(student3);
33. String jsonfromList = mapper.writeValueAsString(stuList);
34. System.out.println(jsonfromList);
35.
36. //List Type is not required here.
37. List stuList2 = mapper.readValue(jsonfromList, List.class);
38. System.out.println(stuList2);
39. System.out.println("************************************");
40.
41. //Convert Map to JSON
42. Map<String, Object> map = new HashMap<String, Object>();
43. map.put("studentList", stuList);
44. map.put("class", "ClassName");
45. String jsonfromMap = mapper.writeValueAsString(map);
46. System.out.println(jsonfromMap);
47.
48. Map map2 = mapper.readValue(jsonfromMap, Map.class);
49. System.out.println(map2);
50. System.out.println(map2.get("studentList"));
51. System.out.println("************************************");
52.
53. //Convert Array to JSON
54. Student[] stuArr = {student1, student3};
55. String jsonfromArr = mapper.writeValueAsString(stuArr);
56. System.out.println(jsonfromArr);
57. Student[] stuArr2 = mapper.readValue(jsonfromArr, Student[].class);
58. System.out.println(Arrays.toString(stuArr2));
59. }
60.
61. }
运行结果:
1. [{"id":5237,"name":"jingshou","birthDay":1389528275987},{"id":5117,"name":"saiya","birthDay":1389528275987}]
2. [{id=5237, name=jingshou, birthDay=1389528275987}, {id=5117, name=saiya, birthDay=1389528275987}]
3. ************************************
4. {"class":"ClassName","studentList":[{"id":5237,"name":"jingshou","birthDay":1389528275987},{"id":5117,"name":"saiya","birthDay":1389528275987}]}
5. {class=ClassName, studentList=[{id=5237, name=jingshou, birthDay=1389528275987}, {id=5117, name=saiya, birthDay=1389528275987}]}
6. [{id=5237, name=jingshou, birthDay=1389528275987}, {id=5117, name=saiya, birthDay=1389528275987}]
7. ************************************
8. [{"id":5237,"name":"jingshou","birthDay":1389528275987},{"id":5117,"name":"saiya","birthDay":1389528275987}]
9. [Student [birthDay=Sun Jan 12 20:04:35 CST 2014, id=5237, name=jingshou], Student [birthDay=Sun Jan 12 20:04:35 CST 2014, id=5117, name=saiya]]
再举一例实际应用:
小米网站注册页面输入邮件地址后,服务器提交的Ajax请求是:
https://account.xiaomi.com/pass/user@externalIdBinded?externalId=9999999%40qq.com&type=EM
服务器的返回是: &&&START&&&{"result":"ok","description":"成功","data":{"userId":-1},"code":0}
我们可以尝试用Map去读取后面那一段JSON
1. package com.jingshou.jackson;
2.
3. import java.io.IOException;
4. import java.util.Map;
5.
6. import com.fasterxml.jackson.core.JsonParseException;
7. import com.fasterxml.jackson.databind.JsonMappingException;
8. import com.fasterxml.jackson.databind.ObjectMapper;
9.
10. public class JacksonTest3 {
11.
12. public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
13. String json = "{\"result\":\"ok\",\"description\":\"成功\",\"data\":{\"userId\":-1},\"code\":0}";
14. ObjectMapper mapper = new ObjectMapper();
15. Map map = mapper.readValue(json, Map.class);
16. //输出 {result=ok, description=成功, data={userId=-1}, code=0}
17. System.out.println(map);
18. //输出{userId=-1}
19. Map dataMap = (Map) map.get("data");
20. System.out.println(dataMap);
21. }
22.
23. }
可见以Key-Value形式的JSON字符串,都可以直接使用Map成功读取出来
Jackson学习三之使用Tree Model读取以及更新JSON
依然是使用ObjectMapper,可以以类似读取DOM的方式读取JSON,请看例子:
1. package com.jingshou.jackson;
2.
3. import java.io.IOException;
4. import java.net.MalformedURLException;
5. import java.net.URL;
6. import java.util.Iterator;
7. import org.apache.commons.io.IOUtils;
8. import com.fasterxml.jackson.databind.JsonNode;
9. import com.fasterxml.jackson.databind.ObjectMapper;
10.
11. public class JacksonTest4 {
12.
13. public static void main(String[] args) throws MalformedURLException, IOException {
14. String url = "http://m.weather.com.cn/data/101210101.html";
15. String json = IOUtils.toString(new URL(url));
16. System.out.println(json);
17.
18. // Get rootNode and weather node;
19. ObjectMapper m = new ObjectMapper();
20. JsonNode rootNode = m.readTree(json);
21. JsonNode weaNode = rootNode.get("weatherinfo");
22. System.out.println(weaNode);
23. System.out.println(weaNode.get("city"));
24.
25. System.out.println("***************************************");
26.
27. // Use Iterator to traverse to tree
28. Iterator<String> keys = weaNode.fieldNames();
29. while(keys.hasNext()){
30. String fieldName = keys.next();
31. System.out.println(fieldName + ": " + weaNode.get(fieldName).textValue());
32. }
33.
34. }
35.
36. }
运行结果:
1. {"weatherinfo":{"city":"杭州","city_en":"hangzhou","date_y":"2014年1月12日","date":"","week":"星期日","fchh":"11","cityid":"101210101"......}
2. "杭州"
3. ***************************************
4. city: 杭州
5. city_en: hangzhou
6. date_y: 2014年1月12日
7. date:
8. week: 星期日
9. fchh: 11
10. cityid: 101210101
11. temp1: 5℃~0℃
12. temp2: 5℃~0℃
13. temp3: 6℃~-2℃
14. ........
以下是新建以及更新Tree Model的例子:
1. package com.jingshou.jackson;
2.
3. import com.fasterxml.jackson.core.JsonProcessingException;
4. import com.fasterxml.jackson.databind.JsonNode;
5. import com.fasterxml.jackson.databind.ObjectMapper;
6. import com.fasterxml.jackson.databind.node.ObjectNode;
7.
8. public class JacksonTest5 {
9.
10. public static void main(String[] args) throws JsonProcessingException {
11. ObjectMapper mapper = new ObjectMapper();
12. JsonNode rootNode = mapper.createObjectNode(); // will be of type ObjectNode
13. ((ObjectNode) rootNode).put("name", "jingshou");
14. ((ObjectNode) rootNode).put("id", 523);
15. ((ObjectNode) rootNode).put("age", 30);
16. System.out.println(rootNode);
17.
18. String json = mapper.writeValueAsString(rootNode);
19. System.out.println(json);
20. ((ObjectNode) rootNode).remove("id");
21. System.out.println(rootNode);
22.
23. }
24.
25. }
运行结果:
1. {"name":"jingshou","id":523,"age":30}
2. {"name":"jingshou","id":523,"age":30}
3. {"name":"jingshou","age":30}
Jackson学习四之使用Streaming API创建以及读取JSON
1. package com.jingshou.jackson;
2.
3. import java.io.File;
4. import java.io.IOException;
5.
6. import com.fasterxml.jackson.core.JsonEncoding;
7. import com.fasterxml.jackson.core.JsonFactory;
8. import com.fasterxml.jackson.core.JsonGenerator;
9. import com.fasterxml.jackson.core.JsonParser;
10. import com.fasterxml.jackson.core.JsonToken;
11.
12. public class JacksonTest6 {
13.
14. public static void main(String[] args) throws IOException {
15. JsonFactory jfactory = new JsonFactory();
16.
17. /*** write to file ***/
18. JsonGenerator jGenerator = jfactory.createGenerator(new File(
19. "c:\\user.json"), JsonEncoding.UTF8);
20. jGenerator.writeStartObject(); // {
21.
22. jGenerator.writeStringField("name", "mkyong"); // "name" : "mkyong"
23. jGenerator.writeNumberField("age", 29); // "age" : 29
24.
25. jGenerator.writeFieldName("messages"); // "messages" :
26. jGenerator.writeStartArray(); // [
27.
28. jGenerator.writeString("msg 1"); // "msg 1"
29. jGenerator.writeString("msg 2"); // "msg 2"
30. jGenerator.writeString("msg 3"); // "msg 3"
31.
32. jGenerator.writeEndArray(); // ]
33.
34. jGenerator.writeEndObject(); // }
35. jGenerator.close();
36.
37. /*** read from file ***/
38. JsonParser jParser = jfactory.createParser(new File("c:\\user.json"));
39. // loop until token equal to "}"
40. while (jParser.nextToken() != JsonToken.END_OBJECT) {
41.
42. String fieldname = jParser.getCurrentName();
43. if ("name".equals(fieldname)) {
44.
45. // current token is "name",
46. // move to next, which is "name"'s value
47. jParser.nextToken();
48. System.out.println(jParser.getText()); // display mkyong
49.
50. }
51.
52. if ("age".equals(fieldname)) {
53.
54. // current token is "age",
55. // move to next, which is "name"'s value
56. jParser.nextToken();
57. System.out.println(jParser.getIntValue()); // display 29
58.
59. }
60.
61. if ("messages".equals(fieldname)) {
62.
63. jParser.nextToken(); // current token is "[", move next
64.
65. // messages is array, loop until token equal to "]"
66. while (jParser.nextToken() != JsonToken.END_ARRAY) {
67.
68. // display msg1, msg2, msg3
69. System.out.println(jParser.getText());
70.
71. }
72.
73. }
74.
75. }
76. jParser.close();
77.
78. }
79.
80. }
小结:
· 对于性能要求高的程序,推荐使用流API,否则使用其他方法
· 不管是创建JsonGenerator还是JsonParser,都是使用JsonFactory