java - 如何在fasterxml中实现自定义序列化功能

标签 java json serialization jackson fasterxml

我的 JSON:

{ “名称”:“asdf”, “年龄”:“15”, “地址”: { “街道”:“asdf” } }

如果 street 为空,使用 JsonSerialize.Inclusion.NON_NULL,我可以得到..

{ “名称”:“asdf”, “年龄”:“15”, “地址”: {} }

但是我想要得到这样的东西..(本地址不为空时,它是一个新的/空的对象。但街道为空。)

{ “名称”:“asdf”, “年龄”:“15” }

我认为具有自定义序列化功能,例如 JsonSerialize.Inclusion.VALID_OBJECT。 在 Address 类中添加 isValid() 方法,如果返回 true,则序列化,否则不序列化。

但我不知道如何继续/要重写哪个类。这是可能的还是对此有其他看法?请提出建议。

<小时/>

添加了类

public static void main(String[] args) {
    ObjectMapper mapper = new ObjectMapper();
    Customer customer = new Customer();
    customer.setName("name");
    customer.setAddress(new Address());
    mapper.writeValue(new File("d:\\customer.json"), customer);
}

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Customer {

private String name;
private Address address;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Address getAddress() {
    return address;
}
public void setAddress(Address address) {
    this.address = address;
}
}

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Address {

private String street;

public String getStreet() {
    return street;
}
public void setStreet(String street) {
    this.street = street;
}
}

注意:我现在不担心反序列化。即地址对象丢失。

提前致谢。

最佳答案

使用序列化自定义 JSON 对象非常简单。

我在我的项目中写了一个claas,我给你一个如何在项目中实现它的线索

Loan Application (POJO Class)

 import java.io.Serializable;
 import java.util.List;
 import org.webservice.business.serializer.LoanApplicationSerializer;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;


  @JsonSerialize(using=LoanApplicationSerializer.class)
  public class LoanApplication  implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private double amount;
private User borrowerId;
private String businessType;
private String currency;
private int duration;
private Date lastChangeDate;
private long loanApplicationId;
private String myStory;
private String productCategory;
private String purpose;
private Date startDate;
private String status;
private String type;
private String salesRepresentative;

现在 LoanApplicationSerializer 类包含使用序列化逻辑的自定义......

    package org.ovamba.business.serializer;

  import java.io.IOException;
  import org.webservice.business.dto.LoanApplication;
  import com.fasterxml.jackson.core.JsonGenerator;
  import com.fasterxml.jackson.core.JsonProcessingException;
  import com.fasterxml.jackson.databind.JsonSerializer;
  import com.fasterxml.jackson.databind.SerializerProvider;

 public class LoanApplicationSerializer extends JsonSerializer<LoanApplication> {

@Override
public void serialize(LoanApplication prm_objObjectToSerialize, JsonGenerator prm_objJsonGenerator, SerializerProvider prm_objSerializerProvider) throws IOException, JsonProcessingException {
    if (null == prm_objObjectToSerialize) {
    } else {
        try {
            prm_objJsonGenerator.writeStartObject();
            prm_objJsonGenerator.writeNumberField("applicationId", prm_objObjectToSerialize.getLoanApplicationId());
            prm_objJsonGenerator.writeStringField("status", prm_objObjectToSerialize.getStatus());
            prm_objJsonGenerator.writeNumberField("amount", prm_objObjectToSerialize.getAmount());
            prm_objJsonGenerator.writeNumberField("startdate", prm_objObjectToSerialize.getStartDate().getTime());
            prm_objJsonGenerator.writeNumberField("duration", prm_objObjectToSerialize.getDuration());
            prm_objJsonGenerator.writeStringField("businesstype", prm_objObjectToSerialize.getBusinessType());
            prm_objJsonGenerator.writeStringField("currency", prm_objObjectToSerialize.getCurrency());
            prm_objJsonGenerator.writeStringField("productcategory", prm_objObjectToSerialize.getProductCategory());
            prm_objJsonGenerator.writeStringField("purpose", prm_objObjectToSerialize.getPurpose());
            prm_objJsonGenerator.writeStringField("mystory", prm_objObjectToSerialize.getMyStory());
            prm_objJsonGenerator.writeStringField("salesRepresentative", prm_objObjectToSerialize.getSalesRepresentative());
        } catch (Exception v_exException) {
            //ExceptionController.getInstance().error("Error while Serializing the Loan Application Object", v_exException);
        } finally {
            prm_objJsonGenerator.writeEndObject();
        }
    }
  }
}

Hope This may help u alot. Thanks..

关于java - 如何在fasterxml中实现自定义序列化功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27279322/

相关文章:

c - 使用 malloc 在 C 中进行序列化

java - Java 对象的序列化

c# - Xml 序列化为 XmlAttribute : namespace prefix lost when Element in same namespace

java - 回答 fileoutputstreams 中 java 中 I/O 流刷新的必要性

java - 以这种方式使用 booleanValue() 检查 boolean 值是否有效

javascript - 访问名称为数字的 JSON 元素

css - 如何在 cytoscapejs 中指定离散映射器样式?

java - 在 Java 中将 int 转换为 hex

java - 如何将 LinkedHashMap 值加载到 Hashtable 中

javascript - 在 Angular 中将范围链接在一起