Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson Json反序列化:无法识别的字段“&引用,不可忽视的_Java_Json_Jackson - Fatal编程技术网

Java Jackson Json反序列化:无法识别的字段“&引用,不可忽视的

Java Jackson Json反序列化:无法识别的字段“&引用,不可忽视的,java,json,jackson,Java,Json,Jackson,我得到了以下错误,但我发现没有解决方法: 无法识别的字段“GaugeDeviceId”(类别GaugeDevice),未标记为可忽略 问题似乎在于,服务返回的属性名称以大写字母开头,而类属性以小写字母开头 我试过: 将PropertyName更改为第一个大写字母-相同错误 将@JsonProperty(“SerialNo”)添加到属性实例化-相同错误 将@JsonProperty(“SerialNo”)添加到相应的getter-相同的错误 将@JsonProperty(“SerialNo”)添加

我得到了以下错误,但我发现没有解决方法:

无法识别的字段“GaugeDeviceId”(类别GaugeDevice),未标记为可忽略

问题似乎在于,服务返回的属性名称以大写字母开头,而类属性以小写字母开头

我试过:

  • 将PropertyName更改为第一个大写字母-相同错误
  • @JsonProperty(“SerialNo”)
    添加到属性实例化-相同错误
  • @JsonProperty(“SerialNo”)
    添加到相应的getter-相同的错误
  • @JsonProperty(“SerialNo”)
    添加到相应的设置程序-相同错误
  • @JsonProperty(“SerialNo”)
    添加到它们中(只是为了好玩)-相同的错误
  • (注意:
    @JsonProperty(“SerialNo”)
    只是一个例子)

    奇怪的是,注释:
    @JsonIgnoreProperties(ignoreUnknown=true)
    应该准确地抑制该错误,但它仍在触发

    这里是课堂:(注:不完整)

    出去的路在哪里?请帮忙

    编辑:

    下面是客户机类:(只是一个简单的测试客户机)


    我希望错误的根源在这里?

    因为以下是您的错误:

    无法识别的字段“GaugeDeviceId”(类别GaugeDevice),未标记为可忽略

    我很确定您需要对
    GaugeDeviceId
    属性执行与对
    SerialNo
    属性相同的操作

    @JsonProperty("SerialNo")
    public String getSerialNo() {
        return this.serialNo;
    }
    
    @JsonProperty("GaugeDeviceId")
    public int getGaugeDeviceId() {
        return this.gaugeDeviceId;
    }
    
    这里我有一个快速测试类,它不会抛出错误

    import org.codehaus.jackson.map.ObjectMapper;
    
    public class JsonDeserialization {
        public static void main(final String[] args) {
            final String json = "{ \"SerialNo\":\"123\", \"GaugeDeviceId\":\"456\"}";
    
            final ObjectMapper mapper = new ObjectMapper();
    
            try {
                final GaugeDevice readValue = mapper.readValue(json, GaugeDevice.class);
                System.out.println(readValue.getSerialNo());
                System.out.println(readValue.getGaugeDeviceId());
            } catch (final Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    它输出:

    123
    456
    
    编辑:版本信息

    这并不重要,因为我相信上面都使用了一些来自jackson的非常标准的东西,我使用的是核心asl映射器asl库的1.9.13


    编辑:客户提供的

    我想知道这是否与你有关?我相信解决方案是您正在使用的依赖项的配置

    我不确定,但我觉得我已经接近了以下依赖项设置(注意,我使用的是maven)

    
    javax.ws.rs
    

    另一件要检查的事情是
    PropertyNamingStrategy
    ,它允许Jackson使用“Pascal命名”并将JSON属性与POJO属性匹配。请参见此处的f.ex:

    我也遇到了同样的问题,我通过将注释导入更改为:

    com.fasterxml.jackson.annotation.JsonIgnoreProperties
    


    无需定义任何NamingStrategy或ObjectMapper。

    在类级别使用注释进行反序列化时,可以忽略未知属性

    例如:

    @JsonIgnoreProperties(ignoreUnknown=true)
    class Foo{
     ...
    }
    
    上面的代码段将忽略任何未知属性。
    (注释导入:org.codehaus.jackson.annotate.JsonIgnoreProperties)

    我遇到了同样的问题,通过将注释导入从

    com.fasterxml.jackson.annotation.JsonProperty
    


    对我有效的解决方案如下

  • 添加导入

    import org.codehaus.jackson.map.DeserializationConfig;
    
  • 配置ObjectMapper

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
    
  • 完全解决方案

    ObjectMapper objectMapper = new ObjectMapper();      
    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);     
    String jsonInString = objectMapper.writeValueAsString(eje); 
    Eje newElement = objectMapper.readValue(jsonInString, Eje.class); 
    this.eje = newElement;
    

  • 将所有私有变量和成员设置为公共。Jackson处理公共成员变量

    public int gaugeDeviceId;
    public Date utcInstallation; 
    ....
    

    是的,有。我的代码只是一个外卖。我已经试过了,但没有成功。@chile那么你能添加反序列化对象的代码吗?如果您的
    GaugeDevice
    具有正确的注释,那么如果
    ObjectMapper
    不包含任何自定义(反)序列化程序,则它应该可以工作。添加了客户端类。。。也许我用了不推荐的东西?谢谢,我也有同样的错误,INTELIJ IDE不询问选择,自动设置错误。
    org.codehaus.jackson.annotate.JsonProperty
    
    import org.codehaus.jackson.map.DeserializationConfig;
    
    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
    
    ObjectMapper objectMapper = new ObjectMapper();      
    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);     
    String jsonInString = objectMapper.writeValueAsString(eje); 
    Eje newElement = objectMapper.readValue(jsonInString, Eje.class); 
    this.eje = newElement;
    
    public int gaugeDeviceId;
    public Date utcInstallation; 
    ....