当前位置: 首页 > 面试题库 >

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

竺焕
2023-03-14
问题内容

我目前正在使用杰克逊2.1.4,并且在将对象转换为JSON字符串时忽略字段时遇到了一些麻烦。

这是我的类,它充当要转换的对象:

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)并将所有变量都设置为null,但是它也不起作用!感谢您的帮助!


问题答案:

您将注解放置在错误的位置-注解必须在类上,而不是在字段上。即:

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

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

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) // or JsonSerialize.Inclusion.NON_EMPTY

另一种选择是ObjectMapper直接配置,只需调用
mapper.setSerializationInclusion(Include.NON_NULL);

(为了便于记录,我认为此答案的流行程度表明该注释 在逐个字段的基础上应用@fasterxml)



 类似资料:
  • 下面是我的类,它充当要转换的对象: 下面是我的转换方法: 输出如下: 下面正是我要查找的输出: 我还尝试了@jsonInclude(include.non_null),并将我的所有变量置为null,但也没有起作用!谢谢你们的帮助!

  • 我有一个这样的对象: 我是否可以使用和我的条件来仅在不为负数的情况下包含该值?或者有没有其他的解决办法我可以做到这一点?

  • 这是我的东西 当我得到响应时,我看到 我的看起来像 问题 如何消除中的值?

  • 问题内容: 我使用以下代码来序列化从外部服务获得的响应,并作为我的服务的一部分返回json响应。但是,当外部服务返回带有时区(10:30:00.000-05.00)的时间值时,杰克逊会将其转换为15:30:00。如何忽略时区值? 问题答案: 您可以创建自定义解串器 告诉杰克逊使用您的自定义解串器 并像这样使用它: 您可以使用Jackson自定义序列化为服务响应添加时区信息

  • 在这种情况下,如果验证失败,我希望将请求返回给用户,并附上相应的错误消息。我遇到的问题是,我使用Jackson处理JSON请求,验证失败也会导致Jackson无法序列化消息。 例如,如果我有此对象: ...当我去序列化时,字段无效(假设它有11个字符)... ...我得到了一个JsonProcessingException(错误验证对象)。我已经确认一个有效的对象序列化没有问题。所以我的问题是:我

  • 问题内容: 我有一些扩展的模型类:它们定义用于包装Map的get和put方法的getter和setter。我正在尝试使用Jackson(带有RESTEasy)序列化这些类的实例,但是Jackson拒绝注意我的getter(使用注释)。而是仅序列化支持映射的键- 值对。我尝试使用禁用所有方法和字段的自动检测功能,但这并没有任何改变。有没有办法防止Jackson序列化Map,还是必须创建不扩展的新模型