Java 响应不包含零整数

Java 响应不包含零整数,java,json,rest,jersey,jackson,Java,Json,Rest,Jersey,Jackson,我有restful API,并使用Jetty作为服务器。我发送了一个post请求来创建我的对象,其中包含一些技能列表。技能包含Stringid和Integer值字段。当我将0或“0”用于带有get响应的整数字段时,我得到的是完全没有值字段的技能数组 @XmlRootElement @JsonAutoDetect(isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility =

我有restful API,并使用Jetty作为服务器。我发送了一个post请求来创建我的对象,其中包含一些
技能
列表。技能包含
String
id和
Integer
值字段。当我将
0
“0”
用于带有get响应的整数字段时,我得到的是完全没有值字段的技能数组

@XmlRootElement
@JsonAutoDetect(isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE,
        creatorVisibility = Visibility.NONE, fieldVisibility = Visibility.NONE)
public class Skill
{

    @com.fasterxml.jackson.annotation.JsonProperty(value="id")
    @javax.validation.constraints.NotNull
    private java.lang.String _id;

    @com.fasterxml.jackson.annotation.JsonProperty(value="value")
    @javax.validation.constraints.NotNull
    private java.lang.Integer _value;

    // getters and setters
}
我的请求主体如下:

{
  // some other fields
  "skills": [{
    "id":"Swedish",
    "value":0
  },{
    "id":"Finnish",
    "value":"0"
  }]
}
{
  // some other fields
  "skills" : [ {
    "id" : "Finnish"
  }, {
    "id" : "Swedish"
  } ]
}
对我的对象应用必要的更改后,我通过以下行传递它以返回:

Response.ok().entity(myObject).build();
get响应的主体如下所示:

{
  // some other fields
  "skills": [{
    "id":"Swedish",
    "value":0
  },{
    "id":"Finnish",
    "value":"0"
  }]
}
{
  // some other fields
  "skills" : [ {
    "id" : "Finnish"
  }, {
    "id" : "Swedish"
  } ]
}
对于其他值,一切正常,但是,0似乎非常特殊,它甚至没有将此字段包含到对象中


问题是为什么以及如何解决它?

对于类似的键,您有不同的值类型: int 0表示“瑞典语”的“值”,字符串“0”表示“芬兰语”的“值”。
如果涉及fields building的某些对象,这可能会导致问题。

问题不在Jetty、Jersey或YaaS。问题似乎出在杰克逊身上。Jackson进行序列化/反序列化,并且似乎进行了一些优化,因此跳过了
0

不幸的是,我还没有找到任何资源来说明为什么要跳过0,并且我没有在Jackson代码中找到发生这种情况的位置

可能的解决方案:

  • 对您的字段使用注释
    @JsonInclude(JsonInclude.Include.ALWAYS)
    ,它将不会被跳过
  • 您的
    整数
    字段不允许为零
  • 使用
    String
    类型而不是
    Integer
  • 问题是,我的对象是由YaaS生成的,因此,我不能仅通过生成的对象进行更改,也不能确定YaaS是否有可能通过1项的注释生成对象。我认为在这种情况下,2选项可能是最好的。

    问题在于Jackson library的版本

    当我们添加
    JsonFeature
    时,默认情况下我们有
    serializeJsonEmptyValues=false

    在本例中,在方法
    JsonFeature#initDefaultObjectMapper
    中,我们将实现
    objMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)

    如果我们查看javaDoc的
    非空
    字段,我们将看到以下内容:

    兼容性说明:Jackson 2.6包含更大范围的“空” 比更早(高达2.5)或更高(2.7及更高)的值 类型;特别是:基本类型的默认值(如0 int/java.lang.Integer和false表示bool/Boolean)的时间戳0 2.7中的日期/时间类型,定义已收紧为仅 包含上面解释的类型(null、缺席、空字符串、空 容器),现在可以使用 非默认值


    因此,这意味着如果使用2.6版,零将消失。这恰好出现在我们的项目中,因为我们使用Redisson,它使用2.6版。我也有同样的问题,但我没有使用@javax.validation.constraints.NotNull

    我所拥有的是

    ObjectMapper objectMapper = new org.codehaus.jackson.map.ObjectMapper();
    objectMapper.setSerializationInclusion(Include.NON_EMPTY);
    
    MyClass myClass = new MyClass();
    myClass.setStringField("some value");
    myClass.setIntField(0);
    
    String json = objectMapper.writeValueAsString(myClass);
    
    System.out.println(json);    // --> { "stringField" : "some value" }
    
    它没有打印值为零的intField。我所要做的只是将非空规则改为:

    objectMapper.setSerializationInclusion(Include.NON_ABSENT);
    String json = objectMapper.writeValueAsString(myClass);
    System.out.println(json);    // --> { "stringField" : "some value" }
    

    您是否使用jersey with Jackson或Jax rs作为JSON提供程序?您是否尝试过使用私有int_值;相反int不可为null。如果您将一个对象转换为json,且Integer为null,则会隐藏字段MBY,请尝试删除NotNull验证并将Integer更改为int。同意,问题是此技能是由json转换为对象的对象(由YaaS生成)生成的,似乎不可能在其中包含基元类型。@dambros,我不是100%理解你的问题,但总的来说,我的服务是基于这个模板的:jersey似乎不关心这个问题,并在某个时候对它进行转换,可能是因为它是json对象,所有东西都是字符串。无论如何,对于其他值,例如2,一切正常,但是,0似乎非常特殊。我使用的是2.8.5,需要有
    MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL)
    以在响应中包含零。(注意非_EMPTY将删除零)