Jackson将pojo对象序列化为json

先是对象: 

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);  

如果想自定义 某个字段 的序列化方法,也有方法。举个例子:

实际开发中,我们一定遇到过这样的问题:

  1. 后端用的时间单位是Date,前端用的秒
  2. 又比如,后端用的金额单位是分,前端用的是元

总之,单位不统一,而且各有各自的理由,统一不了,那就转换吧。
每次返回给前端时再转换一遍,返回给前端的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

猜你喜欢

转载自blog.csdn.net/huanghanqian/article/details/81070297
今日推荐