2014-12-03 100 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

相關問題