1

我有一个自定义序列化程序来将具有空白值的字符串视为 null 并修剪尾随空格。以下是相同的代码。-

public class StringSerializer extends JsonSerializer<String> {

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        String finalValue = null;
        if (value != null) {
            finalValue = value.trim();
            if (finalValue.isEmpty()) {
                finalValue = null;
            }
        }
        gen.writeObject(finalValue);

    }

}

在主bean定义中,属性定义如下——

public class SampleBean {
    private Long id;

    @JsonSerialize(using = StringSerializer.class)
    @JsonInclude(Include.NON_NULL)
    private String attribute1;

    @JsonSerialize(using = StringSerializer.class)
    @JsonInclude(Include.NON_NULL)
    private String attribute2;

    //Getters and setters
}

在自定义序列化程序启动的情况下,不忽略非空值。

例如:

SampleBean bean = new SampleBean();
bean.setId(1L);
bean.setAttribtute1("abc");
bean.setAttribtute2(" ");
new ObjectMapper().writeValueAsString(bean);

writeValueAsString 的输出: {"id": 1, "attribute1": "abc", "attribute2": null}

由于我在属性 2 中有 @JsonInclude(Include.NON_NULL) ,因此预期的输出如下。{“id”:1,“attribute1”:“abc”}

有没有办法做到这一点?

4

4 回答 4

1

我和你有完全一样的问题。JsonInclude.Include.NON_EMPTY 和 JsonInclude.Include.NON_NULL 确实停止使用自定义序列化程序。

我最终创建了一个自定义过滤器并将其与自定义序列化程序一起使用。

请注意,链接https://www.logicbig.com/tutorials/misc/jackson/json-include-customized.html中的示例是错误的。在 equals() 方法中,如果不想包含该字段,则应返回 true,如果要在序列化输出中包含该字段,则应返回 false。这与示例相反。

一些示例代码:

/**
 * Custom Jackson Filter used for @JsonInclude. When the keywords string is empty don't include keywords in the
 * JSON serialization.
 */
public class KeywordsIncludeFilter {

    @Override
    public boolean equals(Object obj) {
        if(obj == null) return true;
        if(obj instanceof String && "".equals((String) obj)) return true;
        return false;
    }
}
于 2021-06-23T04:40:50.953 回答
0

尝试 NON_EMPTY 应该处理空字符串和空字符串。

@JsonSerialize(using = 
StringSerializer.class)
@JsonInclude(Include.NON_EMPTY)

如果这不符合您的要求,请查看此处以创建自定义过滤器,然后在 valueFilter 中使用它

https://www.logicbig.com/tutorials/misc/jackson/json-include-customized.html

于 2020-07-22T20:47:17.330 回答
0

尝试将以下内容添加到您的StringSerializer

@Override
public boolean isEmpty(SerializerProvider provider, String value) {
    if (value != null) {
        String finalValue = value.trim();
        if (finalValue.isEmpty()) {
            return true;
        }
    }

    return false;
}

然后将“非空”注释添加到相关字段,例如:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
private String attribute2;

这会将可抑制值设置为“非空”,然后您可以通过isEmpty()覆盖进行定义。

于 2021-06-24T15:38:08.600 回答
-1

您将值设置为空格而不是空值。

bean.setAttribtute2(" ");

用空值试试。

bean.setAttribtute2(null);
于 2020-07-22T20:22:27.753 回答