java - 当子属性具有尾随空值时 Jackson 反序列化中止

标签 java json serialization null jackson

当发送 JSON 供 Jackson 反序列化时,如果子元素的最后一个值为 null,Jackson 将中止反序列化。

<小时/>

不好:

如果我将此 JSON 发送到接收器(如下),则映射的 Content 对象将为 null,因为反序列化在 image 处停止:

{"user":{"id":"1", "token":"ABC", "image":null},"content":{"id":"2"}}

好:

如果我这样发送,image 仍将具有所需的 null 值,但 Content 对象将使用其 id 创建:

{"user":{"id":"1", "image":null, "token":"ABC"},"content":{"id":"2"}}

这对我来说看起来像是一个错误..?!

<小时/>

简单接收器:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Response create(UserContent source) {
        UserContent dbResult = manager.create(source);
        return Response.status(200)
                .entity(dbResult.getId().toString()).build();
}

序列化器

 public static String objectToString(Object object) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"));

        Writer strWriter = new StringWriter();
        try {
            mapper.writeValue(strWriter, object);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
        String userDataJSON = strWriter.toString();

        return userDataJSON;
    }

我可以设置 ObjectMapper 将所有 null 序列化为 "" 或发送端的空对象吗?

如果我将带有 null 属性的 UserContent 对象传递给上述方法,则生成的 JSON 将具有 null 值,如上面的示例如果列表的最后一项值为 null,反序列化将中止,导致我的后端出现 NullPointerExceptions。

<小时/>

编辑 - UserContent 类:

@Entity
@Table(name = "user_content")
@XmlRootElement
public class UserContent extends org.springframework.data.jpa.domain.AbstractPersistable<Long> {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    @Fetch(FetchMode.JOIN)
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "content_post_id", nullable = false)
    @Fetch(FetchMode.JOIN)
    private Contentcontent;

    // more properties...
}

我们的依赖项:

<properties>
    <jersey-version>1.14</jersey-version>
</properties>
            <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.5</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${jersey-version}</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>${jersey-version}</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>${jersey-version}</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-multipart</artifactId>
        <version>${jersey-version}</version>
    </dependency>


    <dependency>
        <groupId>com.sun.jersey.jersey-test-framework</groupId>
        <artifactId>jersey-test-framework-grizzly2</artifactId>
        <version>${jersey-version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>${jersey-version}</version>
        <scope>test</scope>
    </dependency>

最佳答案

我们现在针对这种奇怪行为的解决方案是通过配置ObjectMapper忽略序列化上的所有空值:

mapper.setSerializationInclusion(Inclusion.NON_NULL);

我们可以在控制双方的情况下做到这一点。我仍然很好奇,如果我们公开提供 REST 服务,如何实际处理如上所述的传入空值星座。

关于java - 当子属性具有尾随空值时 Jackson 反序列化中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13551994/

相关文章:

Java Json数据传输

javascript - 在 ExtJS 中序列化模型的最佳方法

c# - 在 JsonConverter 中递归调用 JsonSerializer

java - 为什么我在这个数组中得到负数?

Java 模块系统和 AspectJ

json - 快速下载和解析 json

javascript - onload后通过json onchange解析而不使用jquery再次获取JSON?

c# - XmlSerializer 不反序列化 DateTime

java - 事件的优先级

java - 使用 java 从 aws elasticache 中放置和获取数据