2014-12-03 98 views
1

我的JSON:如何实现自定义序列化功能在fasterxml

{ "name": "asdf", "age": "15", "address": { "street": "asdf" } }

如果街道为null,与JsonSerialize.Inclusion.NON_NULL,我可以得到..

{ "name": "asdf", "age": "15", "address": {} }

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

{ "name": "asdf", "age": "15" }

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

但我不知道如何进一步/哪个类来覆盖。这是可能的或任何其他意见呢?请建议。


新增类

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

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

在此先感谢。

+0

你试过我的建议吗? – Pracede 2014-12-04 08:08:03

+0

@Pracede感谢您的关注。是的,我已经尝试过,但没有解决问题。它避免了街道(空),但没有在序列化中寻址(新实例/空对象)。 – Malai 2014-12-04 16:15:20

+0

你可以添加你的java类吗? – Pracede 2014-12-04 16:32:15

回答

1

定制JSON对象非常简单。

我已经在我的项目写了克拉斯我给UA线索,如何实现这一点的项目

贷款申请(POJO类)

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.. 
0

您可以通过@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

例注释类做到这一点:使用序列

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 
public myClass{ 
// attributes and accessors 
} 

你可以找到一些有用的信息,在Jackson faster xml

相关问题