杰森序列化:忽略空值(或null)

我目前正在使用jackson2.1.4,我有一些麻烦,当我将对象转换为JSONstring时忽略字段。

这是我的课,作为被转换的对象:

public class JsonOperation { public static class Request { @JsonInclude(Include.NON_EMPTY) String requestType; Data data = new Data(); public static class Data { @JsonInclude(Include.NON_EMPTY) String username; String email; String password; String birthday; String coinsPackage; String coins; String transactionId; boolean isLoggedIn; } } public static class Response { @JsonInclude(Include.NON_EMPTY) String requestType = null; Data data = new Data(); public static class Data { @JsonInclude(Include.NON_EMPTY) enum ErrorCode { ERROR_INVALID_LOGIN, ERROR_USERNAME_ALREADY_TAKEN, ERROR_EMAIL_ALREADY_TAKEN }; enum Status { ok, error }; Status status; ErrorCode errorCode; String expiry; int coins; String email; String birthday; String pictureUrl; ArrayList <Performer> performer; } } } 

以下是我如何转换它:

 ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); JsonOperation subscribe = new JsonOperation(); subscribe.request.requestType = "login"; subscribe.request.data.username = "Vincent"; subscribe.request.data.password = "test"; Writer strWriter = new StringWriter(); try { mapper.writeValue(strWriter, subscribe.request); } catch (JsonGenerationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JsonMappingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("JSON", strWriter.toString()) 

这是输出:

 {"data":{"birthday":null,"coins":null,"coinsPackage":null,"email":null,"username":"Vincent","password":"test","transactionId":null,"isLoggedIn":false},"requestType":"login"} 

我怎样才能避免这些空值? 我只想为“订阅”目的收集必要的信息!

这就是我正在寻找的输出:

 {"data":{"username":"Vincent","password":"test"},"requestType":"login"} 

我也试过了@JsonInclude(Include.NON_NULL),把我所有的variables都设为null,但是也没有用! 谢谢你们的帮助!

你在错误的地方有注释 – 它需要在课堂上,而不是在课堂上。 即:

 @JsonInclude(Include.NON_NULL) //or Include.NON_EMPTY, if that fits your use case public static class Request { // ... } 

如注释中所述,在2.x版本中,此注释的语法是:

 @JsonInclude(JsonSerialize.Inclusion.NON_NULL) // or JsonSerialize.Inclusion.NON_EMPTY 

另一个select是直接configurationObjectMapper ,只需调用mapper.setSerializationInclusion(Include.NON_NULL);

(为了logging,我认为这个答案的普及是一个迹象表明,这个注释应该适用于逐字段的基础* ahem @ fasterxml *)

您也可以设置全局选项:

 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 

也可以尝试使用

 @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

如果你正在处理jackson版本低于2+(1.9.5)我testing了它,你可以很容易地使用这个注释上面的类。 不是为属性指定的,只是为了class decleration。

你需要添加import com.fasterxml.jackson.annotation.JsonInclude;

 @JsonInclude(JsonInclude.Include.NON_NULL) 

在POJO之上

如果你有嵌套的POJO那么

 @JsonInclude(JsonInclude.Include.NON_NULL) 

需要添加每个值。

注:JAXRS(泽西岛)自动处理这种情况下2.6和以上。

对于jackson2.x

@JsonInclude(JsonInclude.Include.NON_NULL)就在字段之前。

或者您可以使用GSON [ https://code.google.com/p/google-gson/ ],这些空字段将被自动删除。

SampleDTO.java

 public class SampleDTO { String username; String email; String password; String birthday; String coinsPackage; String coins; String transactionId; boolean isLoggedIn; // getters/setters } 

Test.java

 import com.google.gson.Gson; public class Test { public static void main(String[] args) { SampleDTO objSampleDTO = new SampleDTO(); Gson objGson = new Gson(); System.out.println(objGson.toJson(objSampleDTO)); } } 

OUTPUT:

 {"isLoggedIn":false} 

我用gson-2.2.4

我最近在版本2.6.6中遇到了类似的问题。

 @JsonInclude(JsonInclude.Include.NON_NULL) 

使用上面的注释无论是在档案或课堂上没有按预期工作。 在应用注解时,POJO是可变的。 当我将POJO的行为改变为不可改变的时候,注解发挥了神奇的作用。

我不知道是否它的新版本或以前版本的这个库有相似的行为,但是对于2.6.6,当然你需要有不可变的POJO来使注解工作。

 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 

以上在ObjectMapper直接在全局级别设置序列化包含的各种答案中提到的选项都可以使用,但是我更喜欢在类或者字段级别上进行控制。

所以,如果你想在JSON序列化的时候忽略所有的空字段,然后在类级别使用注释,但是如果只想在类中忽略几个字段,那么就在这些特定的字段上使用它。 如果你想改变特定响应的行为,这种方式更易读易维护。

它可以实现2种方式:

  1. 标记POJO忽略空/空属性

     import com.fasterxml.jackson.annotation.JsonInclude @JsonInclude(Include.NON_NULL) // or @JsonInclude(Include.NON_EMPTY) 
  2. configuration序列化POJO / json的ObjectMapper,如下所示:

     import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);