2012-11-25 24 views
1

当发送一个JSON以被Jackson反序列化时,似乎如果子元素的最后一个值是null,Jackson将中止反序列化。杰克逊Deserialization当子属性的值为空值时终止


坏:

如果我这个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"}} 

这看起来像一个bug给我..?!


简单的接收器

@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值像上面的例子,应该在列表的最后一个项目的值为空,反序列化将中止会导致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> 
+0

您错过了“UserContent”类的问题描述中最重要的部分。请添加它,这样可以解释或复制问题。另外,请包括使用的杰克逊版本。 – StaxMan

+0

谢谢StaxMan,没想到那会很关键。编辑我的帖子。希望你可能知道该怎么做.. – Pete

+1

任何其他杰克逊模块在使用?我也假设必须有吸气剂或吸附剂,因为私人领域没有被检测到。我所得到的只是再现问题。单元测试中包含类似的结构,所以应该对你的用例有一些特别的东西;我只是想着想什么可能是不同的。 – StaxMan

回答

0

我们的解决方案,现在这种奇怪的beahavior是忽略序列化所有空值由配置ObjectMapper

mapper.setSerializationInclusion(Inclusion.NON_NULL); 

,我们CONTROLE两侧,我们可以做的。如果我们公开提供REST服务,我仍然很好奇如何实际处理如上所述的传入null值constelation。

+1

这听起来像一个错误,绝对不应该打破。 – StaxMan

-2

假设你正在使用的球衣。你可以尝试在服务器端用Genson替换jackson,它应该可以解决你的问题。确实,它看起来像一个错误。一定要删除jackson和jersey-json。您不需要任何配置就可以使用Genson启用json支持,只需将jar放入您的类路径即可。