当前位置: 首页 > 知识库问答 >
问题:

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

陶乐生
2023-03-14

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

坏的:

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

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

好:

如果我像这样发送它,图像仍将具有所需的值,但将使用其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在发送端将所有< code>null序列化为< code>""或空对象吗?

如果我将带有<code>null

编辑-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>

共有2个答案

柳项明
2023-03-14

假设您正在使用球衣。您可以尝试在服务器端用Genson替换jackson,这应该会解决您的问题。事实上,它看起来像一个bug。确保删除jackson和jersey json。您不需要任何配置来启用Genson的json支持,只需在类路径中删除jar即可。

盖昀
2023-03-14

对于这个奇怪的beahavior,我们现在的解决方案是通过配置对象映射器来忽略序列化上的所有空值:

mapper.setSerializationInclusion(Inclusion.NON_NULL);

我们可以在控制双方时做到这一点。我仍然很好奇,如果我们使REST服务公开可用,如何如上所述实际处理传入的空值组件。

 类似资料:
  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 希, 我所拥有的: 公开课myPojo 我想要的是,如果Map中的一个字段不满足POJO,则使从Map到POJO的转换失败(抛出异常)。 它似乎不能使用DeserializationFeature进行任何类型的配置。我试图调整所有与空字段有关的配置

  • 我正在寻找一种解决方案,使用Jackson基于同一POJO中的其他属性值序列化POJO对象属性 如果某个属性值符合某些条件,则应根据要求更改其他属性值 例如,下面是我的JSON对象: 在上述情况下,如果的值符合某些条件,那么我应该能够更改的值 为什么需要这样做: 是一个配置对象 和-是配置设置 在上面的例子中,中有一个是,我需要屏蔽/更改相应的 还要补充一点,在这个例子中,属性是和,但是如果我们找

  • 我的JSON字符串是: 我想要实现的是,当JSON中没有提供schemaVersion时,能够在默认情况下反序列化到SubClassV1,但即使在Superclass中将schemaVersion初始化为“1.0”时,我仍然会收到以下错误: