jackson学习

来源:互联网 发布:java多线程日志输出 编辑:程序博客网 时间:2024/06/18 13:46


ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。

Jackson学习一之对象与JSON互相转化

新建基本Student类:

Java代码  

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. }  

 班级类:

Java代码  

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. }  

 

测试代码:

Java代码  

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. }  

 运行结果:

Text代码  

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互相转换.

Java代码  

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. }  

 运行结果:

Text代码  

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

Java代码  

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,请看例子:

Java代码  

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. }  

 运行结果:

Java代码  

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: 2014112日  

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的例子:

Java代码  

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. }  

 运行结果:

Java代码  

1. {"name":"jingshou","id":523,"age":30}  

2. {"name":"jingshou","id":523,"age":30}  

3. {"name":"jingshou","age":30}  

 

 

Jackson学习四之使用Streaming API创建以及读取JSON

Java代码  

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

 


0 0
原创粉丝点击