依赖maven:
com.fasterxml.jackson.core
jackson-databind
2.6.5
com.fasterxml.jackson.core
jackson-core
2.6.5
com.fasterxml.jackson.core
jackson-annotations
2.6.5
code:
User:
import lombok.*;
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructorpublic classUser {private intid;privateString name;privateString email;privateString address;privateBirthday birthday;
}
Birthday:
import lombok.*;
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructorpublic classBirthday {privateString birthday;
}
User2:
importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importlombok.ToString;
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructorpublic classUser2 {private intid;privateString name;privateString email;//private String address;//private Birthday birthday;
}
1.查看基础类型的序列化与反序列化:
importcom.fasterxml.jackson.databind.ObjectMapper;importlombok.val;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;public classtest{private final static ObjectMapper objectMapper = newObjectMapper();public static voidmain(String[] args) {
User user= newUser();
user.setAddress("asdf");
user.setAddress("中国河南省");
user.setEmail("xiaokui_wingfly@sina.com.cn");
user.setId(1);
user.setName("X-rapido");
user.setBirthday(new Birthday("2015-08-06"));
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
Map map = new HashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("list", list);
String []sz= {"a","b","c"};try{
System.out.println(objectMapper.writeValueAsString(user));
System.out.println(objectMapper.writeValueAsString(list));
System.out.println(objectMapper.writeValueAsString(map));
System.out.println(objectMapper.writeValueAsString(sz));
String s= "{\"name\":\"X-rapido\"}";//Json转换JavaBean
User a = objectMapper.readValue(s, User.class);
System.out.println(a.getName());//JavaBean转换Json
System.out.println(objectMapper.writeValueAsString(a));
}catch(IOException e) {
e.printStackTrace();
}
}
}
Output:
{"id":1,"name":"X-rapido","email":"xiaokui_wingfly@sina.com.cn","address":"中国河南省","birthday":{"birthday":"2015-08-06"}}
["a","b","c"]
{"a":"1","b":"2","c":"3","list":["a","b","c"]}
["a","b","c"]
X-rapido
{"id":0,"name":"X-rapido","email":null,"address":null,"birthday":null}
2.有这么种情况,就是字符串反序列化为对象,但是字符串中的很多字段我都不需要,只需要一部分,这个时候怎么反序列化:
importcom.fasterxml.jackson.databind.DeserializationFeature;importcom.fasterxml.jackson.databind.ObjectMapper;importlombok.val;importjava.io.IOException;public classtest{private final static ObjectMapper objectMapper = newObjectMapper();public static voidmain(String[] args) {//当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,//因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
objectMapper .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
User user= newUser();
user.setAddress("asdf");
user.setAddress("中国河南省");
user.setEmail("xiaokui_wingfly@sina.com.cn");
user.setId(1);
user.setName("X-rapido");
user.setBirthday(new Birthday("2015-08-06"));try{
System.out.println("========begin=======");
val content=objectMapper.writeValueAsString(user);
System.out.println(content);
User2 u=objectMapper.readValue(content,User2.class);
System.out.println(objectMapper.writeValueAsString(u));
System.out.println("========end=======");
}catch(IOException e) {
e.printStackTrace();
}
}
}
Output:
========begin======={"id":1,"name":"X-rapido","email":"xiaokui_wingfly@sina.com.cn","address":"中国河南省","birthday":{"birthday":"2015-08-06"}}
{"id":1,"name":"X-rapido","email":"xiaokui_wingfly@sina.com.cn"}========end=======
注意:
objectMapper .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
如果不加这个会报错:
========begin======={"id":1,"name":"X-rapido","email":"xiaokui_wingfly@sina.com.cn","address":"中国河南省","birthday":{"birthday":"2015-08-06"}}
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field"address" (class com.qhong.json.User2), not marked as ignorable (3 known properties: "id", "email", "name"])
at [Source: {"id":1,"name":"X-rapido","email":"xiaokui_wingfly@sina.com.cn","address":"中国河南省","birthday":{"birthday":"2015-08-06"}}; line: 1, column: 76] (through reference chain: com.qhong.json.User2["address"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:839)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1045)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1352)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1330)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:264)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3736)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2726)
at com.qhong.json.test.main(test.java:29)
3.怎么反序列化对象数组:
importcom.fasterxml.jackson.databind.DeserializationFeature;importcom.fasterxml.jackson.databind.ObjectMapper;importlombok.val;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;public classtest{private final static ObjectMapper objectMapper = newObjectMapper();public static voidmain(String[] args) {//当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,//因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
objectMapper .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
List arr=Arrays.asList(new User(1, "name1", "email1", "address1", new Birthday("2016-08-01")),new User(2 ,"name2", "email2", "address2", new Birthday("2016-08-02")),new User(3, "name3", "email3", "address3", new Birthday("2016-08-03"))
);try{
System.out.println("========begin=======");
val content=objectMapper.writeValueAsString(arr);
System.out.println(content);
List list=objectMapper.readValue(content,new com.fasterxml.jackson.core.type.TypeReference>(){});
System.out.println(objectMapper.writeValueAsString(list));
System.out.println("另外的方式:");//List myObjects = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, MyClass.class));
List list2=objectMapper.readValue(content,objectMapper.getTypeFactory().constructCollectionType(ArrayList.class,User.class));
System.out.println(objectMapper.writeValueAsString(list2));
System.out.println("========end=======");
}catch(IOException e) {
e.printStackTrace();
}
}
}
Output:
========begin=======[{"id":1,"name":"name1","email":"email1","address":"address1","birthday":{"birthday":"2016-08-01"}},{"id":2,"name":"name2","email":"email2","address":"address2","birthday":{"birthday":"2016-08-02"}},{"id":3,"name":"name3","email":"email3","address":"address3","birthday":{"birthday":"2016-08-03"}}]
[{"id":1,"name":"name1","email":"email1","address":"address1","birthday":{"birthday":"2016-08-01"}},{"id":2,"name":"name2","email":"email2","address":"address2","birthday":{"birthday":"2016-08-02"}},{"id":3,"name":"name3","email":"email3","address":"address3","birthday":{"birthday":"2016-08-03"}}]
另外的方式:
[{"id":1,"name":"name1","email":"email1","address":"address1","birthday":{"birthday":"2016-08-01"}},{"id":2,"name":"name2","email":"email2","address":"address2","birthday":{"birthday":"2016-08-02"}},{"id":3,"name":"name3","email":"email3","address":"address3","birthday":{"birthday":"2016-08-03"}}]========end=======
还有一些其他的特殊情况,比如json对象key没有双引号等
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;public classtest2{private final static ObjectMapper mapper= newObjectMapper();public static voidmain(String[] args) {try{
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);//如果为空则不输出
mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);//对于空的对象转json的时候不抛出错误
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);//禁用序列化日期为timestamps
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);//禁用遇到未知属性抛出异常
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);//视空字符传为null
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);//低层级配置
mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);//允许属性名称没有引号
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);//允许单引号
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);//取消对非ASCII字符的转码
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false);//mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
String str = "[\n" +
"{\n" +
"\"symbol\": \"sh603111\", \n" +
"\"code\": \"603111\", \n" +
"\"name\": \"康尼机电\", \n" +
"\"trade\": \"14.530\", \n" +
"\"pricechange\": \"0.770\", \n" +
"\"changepercent\": \"5.596\", \n" +
"\"buy\": \"14.530\", \n" +
"\"sell\": \"14.540\", \n" +
"\"settlement\": \"13.760\", \n" +
"\"open\": \"13.820\", \n" +
"\"high\": \"14.540\", \n" +
"\"low\": \"13.820\", \n" +
"\"volume\": 18591408, \n" +
"\"amount\": 266138177, \n" +
"\"ticktime\": \"15:00:00\", \n" +
"\"per\": 44.339, \n" +
"\"pb\": 7.731, \n" +
"\"mktcap\": 1072870.86225, \n" +
"\"nmc\": 697004.688465, \n" +
"\"turnoverratio\": 3.87563\n" +
"}, \n" +
"{\n" +
"\"symbol\": \"sz300355\", \n" +
"\"code\": \"300355\", \n" +
"\"name\": \"蒙草生态\", \n" +
"\"trade\": \"12.330\", \n" +
"\"pricechange\": \"0.620\", \n" +
"\"changepercent\": \"5.295\", \n" +
"\"buy\": \"12.330\", \n" +
"\"sell\": \"12.340\", \n" +
"\"settlement\": \"11.710\", \n" +
"\"open\": \"11.640\", \n" +
"\"high\": \"12.580\", \n" +
"\"low\": \"11.640\", \n" +
"\"volume\": 142839605, \n" +
"\"amount\": 1741652819, \n" +
"\"ticktime\": \"15:06:03\", \n" +
"\"per\": 35.229, \n" +
"\"pb\": 6.27, \n" +
"\"mktcap\": 1978030.485873, \n" +
"\"nmc\": 1428385.32288, \n" +
"\"turnoverratio\": 12.33009\n" +
"}\n" +
"]";
System.out.println(str);
List list = mapper.readValue(str, new TypeReference>() {
});
System.out.println(list.size());
}catch(Exception ex){
System.out.println(ex.getMessage());
System.out.println(ex.getStackTrace());
}
}
}
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructorclassriseInfo {privateString symbol;privateString code;privateString name;
}
Output:
[
{"symbol": "sh603111","code": "603111","name": "康尼机电","trade": "14.530","pricechange": "0.770","changepercent": "5.596","buy": "14.530","sell": "14.540","settlement": "13.760","open": "13.820","high": "14.540","low": "13.820","volume": 18591408,"amount": 266138177,"ticktime": "15:00:00","per": 44.339,"pb": 7.731,"mktcap": 1072870.86225,"nmc": 697004.688465,"turnoverratio": 3.87563},
{"symbol": "sz300355","code": "300355","name": "蒙草生态","trade": "12.330","pricechange": "0.620","changepercent": "5.295","buy": "12.330","sell": "12.340","settlement": "11.710","open": "11.640","high": "12.580","low": "11.640","volume": 142839605,"amount": 1741652819,"ticktime": "15:06:03","per": 35.229,"pb": 6.27,"mktcap": 1978030.485873,"nmc": 1428385.32288,"turnoverratio": 12.33009}
]2
添加配置即可!