java jackson注意_Jackson 使用和注意项

依赖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

添加配置即可!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值