先是对象:
public class User {
public int id;
public String name;
}
public class Item {
public int id;
public String itemName;
public User owner;
}
JACKSON一般的使用很容易,如;
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);
结果为:
{
"id": 1,
"itemName": "theItem",
"owner": {
"id": 2,
"name": "theUser"
}
}
如果要输出为如下的样子,比如;
{
"id": 25,
"itemName": "FEDUfRgS",
"owner": 15
}
则要自定义了,要继承JsonSerializer类,如下:
public class ItemSerializer extends JsonSerializer<Item> {
@Override
public void serialize(Item value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.id);
jgen.writeStringField("itemName", value.itemName);
jgen.writeNumberField("owner", value.owner.id);
jgen.writeEndObject();
}
}
然后
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Item.class, new ItemSerializer());
mapper.registerModule(module);
String serialized = mapper.writeValueAsString(myItem);
看,相当复杂,然后看有无办法简单点。其实是有的哦;方法为:
@JsonSerialize(using = ItemSerializer.class)
public class Item {
...
}
就是使用注解@JsonSerialize,然后:
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);
如果想自定义 某个字段 的序列化方法,也有方法。举个例子:
实际开发中,我们一定遇到过这样的问题:
- 后端用的时间单位是Date,前端用的秒
- 又比如,后端用的金额单位是分,前端用的是元
总之,单位不统一,而且各有各自的理由,统一不了,那就转换吧。
每次返回给前端时再转换一遍,返回给前端的json数据,在后端里定义的往往是一个对象,如何做到优雅的转换呢?只需两步。
1. 写一个负责转换的类,里面写好规则。
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.Date;
/**
* @version 1.0 2016/12/7
* @since 1.0
*/
public class Date2LongSerialize extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeNumber(date.getTime() / 1000);
}
}
2. 在返回的参数里加上注解。
@Data
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class PledgeDetailItemVO implements Serializable {
private static final long serialVersionUID = 2308418084162500432L;
private String remark;
@JsonSerialize(using = Date2LongSerialize.class)
private Date addTime;
}
这样就能做到自动转换了。
ObjectMapper类的writeValueAsString、valueToTree、readTree等方法:
ObjectMapper mapper = new ObjectMapper();
String jsonStr=mapper.writeValueAsString(A);//A是任何一个java类,得到的是一个json格式的String
JsonNode jn=mapper.valueToTree(B);//B是任何一个java类,得到的是一个JsonNode类型(这个是Jackson框架jar包的一个类型)
JsonNode jn=mapper.readTree(C);//C是一个json格式String,得到的是一个JsonNode类型
List list=mapper.readValue(D,List.class);//D是一个json格式String,得到的是一个List类型
问:我怎么记住,每个方法得到的是什么?
记忆技巧:方法的最末的单词(即标红的位置)意思是什么,得到的就是什么。两者一样。
转载自:
1. https://blog.csdn.net/Ideality_hunter/article/details/53337535
2. https://blog.csdn.net/qq_35873847/article/details/79239752