JackSon入门

来源:互联网 发布:少女前线 mac 10 旋风 编辑:程序博客网 时间:2024/06/05 17:49

Jackson有三种处理方式: Streaming API  

 

    使用org.codehaus.jackson.JsonParser 进行读操作 , 使用org.codehaus.jackson.JsonGenerator 写操作       Jackson Streaming API有点类似 Stax API  

数据绑定   它允许我们把Json转换成Java对象,也可以把Java对象转换成Json对象 

 

   org.codehaus.jackson.map.ObjectMapper 知道如何把Json数据绑定成为(或者映射回)Java对象  

树模型   通过进驻内存的树形结构来方便的访问Json数据 

 

  和数据绑定方式类似,树模型也使用了 

org.codehaus.jackson.map.ObjectMapper进行Json数据和Java对象的绑定;只是树形结构由 org.codehaus.jackson.map.JsonNode节点组成      

从使用的角度看,上述三种方式可以归纳为 : 

 

Streaming API是性能最优的(开销最小,最快的读写速度)  注:在我看来,操作最随心所欲的   数据绑定是最方便使用的   树形模型又是最灵活的  

    Java类: Java代码 

 

 

1. public class User {      

2.     public enum Gender { MALE, FEMALE };      3.       

4.     public static class Name {      

5.       private String _first, _last;      6.       

7.       public String getFirst() { return _first; }      

 

 

8.       public String getLast() { return _last; }      9.       

10.      public void setFirst(String s) { _first = s; }      11.      public void setLast(String s) { _last = s; }      12.    }      13.      

14.    private Gender _gender;      15.    private Name _name;      

16.    private boolean _isVerified;      17.    private byte[] _userImage;      18.      

19.    public Name getName() { return _name; }      

20.    public boolean isVerified() { return _isVerified; }      21.    public Gender getGender() { return _gender; }      

22.    public byte[] getUserImage() { return _userImage; }      23.      

24.    public void setName(Name n) { _name = n; }      

25.    public void setVerified(boolean b) { _isVerified = b; }      

26.    public void setGender(Gender g) { _gender = g; }      

27.    public void setUserImage(byte[] b) { _userImage = b; }      28.}       

Java代码 

  

1. public class User {    

2.     public enum Gender { MALE, FEMALE };    3.    

4.     public static class Name {    

5.       private String _first, _last;    6.    

7.       public String getFirst() { return _first; }    8.       public String getLast() { return _last; }    9.    

10.      public void setFirst(String s) { _first = s; }    11.      public void setLast(String s) { _last = s; }    12.    }    13.   

14.    private Gender _gender;    15.    private Name _name;    

16.    private boolean _isVerified;    17.    private byte[] _userImage;    18.   

 

 

19.    public Name getName() { return _name; }    

20.    public boolean isVerified() { return _isVerified; }    21.    public Gender getGender() { return _gender; }    

22.    public byte[] getUserImage() { return _userImage; }    23.   

24.    public void setName(Name n) { _name = n; }    

25.    public void setVerified(boolean b) { _isVerified = b; }    26.    public void setGender(Gender g) { _gender = g; }    

27.    public void setUserImage(byte[] b) { _userImage = b; }    28.}      

  JSon数据: Java代码 

 

 

1.  {      

2. "name" : { "first" : "Joe", "last" : "Sixpack" },      3. "gender" : "MALE",      4. "verified" : false,      

5. "userImage" : "Rm9vYmFyIQ=="      6.        

Java代码 

  

1. {    

2.   "name" : { "first" : "Joe", "last" : "Sixpack" },    3.   "gender" : "MALE",    4.   "verified" : false,    

5.   "userImage" : "Rm9vYmFyIQ=="   6. }      

Streaming API (这部分我比较关注,就先翻译下)比数据绑定的方式会快20%到30%  写操作: Java代码 

 

 

1. JsonFactory f = new JsonFactory();    

2. JsonGenerator g = f.createJsonGenerator(new File("user.json"));      3.       

4. g.writeStartObject();      

5. g.writeObjectFieldStart("name");      6. g.writeStringField("first", "Joe");      7. g.writeStringField("last", "Sixpack");      8. g.writeEndObject(); // for field 'name'      9. g.writeStringField("gender", Gender.MALE);      10.g.writeBooleanField("verified", false);      

11.g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?)      

12.byte[] binaryData = ...;      13.g.writeBinary(binaryData);      14.g.writeEndObject();     

Java代码 

  

1. JsonFactory f = new JsonFactory();    

2. JsonGenerator g = f.createJsonGenerator(new File("user.json"));    3.    

4. g.writeStartObject();    

5. g.writeObjectFieldStart("name");    6. g.writeStringField("first", "Joe");    7. g.writeStringField("last", "Sixpack");    8. g.writeEndObject(); // for field 'name'    9. g.writeStringField("gender", Gender.MALE);    10.g.writeBooleanField("verified", false);    

11.g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?)    

12.byte[] binaryData = ...;    13.g.writeBinary(binaryData);    14.g.writeEndObject();    读操作: Java代码 

 

 

1. JsonFactory f = new JsonFactory();      

2. JsonParser jp = f.createJsonParser(new File("user.json"));      3. User user = new User();      

4. jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)

5. while (jp.nextToken() != JsonToken.END_OBJECT) {      6.   String fieldname = jp.getCurrentName();      

7.   jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY      

8.   if ("name".equals(fieldname)) { // contains an object      9.     Name name = new Name();      

10.    while (jp.nextToken() != JsonToken.END_OBJECT) {      11.      String namefield = jp.getCurrentName();      12.      jp.nextToken(); // move to value      13.      if ("first".equals(namefield)) {      14.        name.setFirst(jp.getText());      

15.      } else if ("last".equals(namefield)) {      16.        name.setLast(jp.getText());      17.      } else {      

18.        throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");      19.      }      20.    }      

21.    user.setName(name);      

22.  } else if ("gender".equals(fieldname)) {      

23.    user.setGender(Gender.valueOf(jp.getText()));      24.  } else if ("verified".equals(fieldname)) {      

25.    user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE);      

26.  } else if ("userImage".equals(fieldname)) {      27.    user.setUserImage(jp.getBinaryValue());      28.  } else {      

29.    throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");      30.  }       

Java代码 

  

1. ReadJSON.java    

2. JsonFactory f = new JsonFactory();    

3. JsonParser jp = f.createJsonParser(new File("user.json"));    4. User user = new User();    

5. jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)    

6. while (jp.nextToken() != JsonToken.END_OBJECT) {    7.   String fieldname = jp.getCurrentName();    

8.   jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY    

 

 

9.   if ("name".equals(fieldname)) { // contains an object    10.    Name name = new Name();    

11.    while (jp.nextToken() != JsonToken.END_OBJECT) {    12.      String namefield = jp.getCurrentName();    13.      jp.nextToken(); // move to value    14.      if ("first".equals(namefield)) {    15.        name.setFirst(jp.getText());    

16.      } else if ("last".equals(namefield)) {    17.        name.setLast(jp.getText());    18.      } else {    

19.        throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");    20.      }    21.    }    

22.    user.setName(name);    

23.  } else if ("gender".equals(fieldname)) {    

24.    user.setGender(Gender.valueOf(jp.getText()));    25.  } else if ("verified".equals(fieldname)) {    

26.    user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE);    

27.  } else if ("userImage".equals(fieldname)) {    28.    user.setUserImage(jp.getBinaryValue());    29.  } else {    

30.    throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");    31.  }    32.}     

数据绑定:  Java代码 

 

 

1. //读      

2. ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally      

3. User user = mapper.readValue(new File("user.json"), User.class);      4.       

5. //写      

6. mapper.writeValue(<span class="code-keyword">new</span>      7.       8.       

9.  File(<span class="code-quote">"user-modified.json"</span>      

 

10.      11.      

12.), user);}       

Java代码 

  

1. //读    

2. ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally    

3. User user = mapper.readValue(new File("user.json"), User.class);    4.    

5. //写    

6. mapper.writeValue(<SPAN class=code-keyword>new</SPAN>    7.    8.    9.    

10. File(<SPAN class=code-quote>"user-modified.json"</SPAN>    11.   12.   13.   

14.), user);    无类型的数据绑定: Java代码 

 

 

1. HashMap<String,Object> untyped = new HashMap<String,Object>();      

2. HashMap<String,String> nameStruct = new HashMap<String,String>();      

3. nameStruct.put("first", "Joe");      4. nameStruct.put("last", "Sixpack");      5. untyped.put("name", nameStruct);      6. untyped.put("gender", "MALE");      

7. untyped.put("verified", Boolean.FALSE);      8. untyped.put("userImage", "Rm9vYmFyIQ==");     

Java代码 

  

1. HashMap<String,Object> untyped = new HashMap<String,Object>();    

 

 

2. HashMap<String,String> nameStruct = new HashMap<String,String>();    

3. nameStruct.put("first", "Joe");    4. nameStruct.put("last", "Sixpack");    5. untyped.put("name", nameStruct);    6. untyped.put("gender", "MALE");    

7. untyped.put("verified", Boolean.FALSE);    8. untyped.put("userImage", "Rm9vYmFyIQ==");     

树模型:  

可以使用Stream API或者数据绑定的方式写或者ObjectMapper读取树树结构 ObjectMapper的方式: Java代码 

 

 

1. ObjectMapper m = new ObjectMapper();      

2. // can either use mapper.readTree(JsonParser), or bind to JsonNode      

3. JsonNode rootNode = m.readValue(new File("user.json"), JsonNode.class);      

4. // ensure that "last name" isn't "Xmler"; if is, change to "Jsoner"      

5. JsonNode nameNode = rootNode.path("name");      

6. String lastName = nameNode.path("last").getTextValue().      7. if ("xmler".equalsIgnoreCase(lastName)) {      

8.   ((ObjectNode)nameNode).put("last", "Jsoner");      9. }      

10.// and write it out:      

11.m.writeValue(new File("user-modified.json"), rootNode);         Java代码 

 

 

1. ObjectMapper m = new ObjectMapper();    

2. // can either use mapper.readTree(JsonParser), or bind to JsonNode    

3. JsonNode rootNode = m.readValue(new File("user.json"), JsonNode.class);    

 

4. // ensure that "last name" isn't "Xmler"; if is, change to "Jsoner"    

5. JsonNode nameNode = rootNode.path("name");    

6. String lastName = nameNode.path("last").getTextValue().    7. if ("xmler".equalsIgnoreCase(lastName)) {    

8.   ((ObjectNode)nameNode).put("last", "Jsoner");    9. }    

10.// and write it out:    

11.m.writeValue(new File("user-modified.json"), rootNode);     

绝招:可以在JsonParser和JsonGenerator中直接使用数据绑定或者树模型的方式的,看一下以下方法就知道怎么用了  

JsonParser.readValueAs()   JsonParser.readValueAsTree()   JsonGenerator.writeObject()   JsonGenerator.writeTree() 

0 0
原创粉丝点击