Jackson Json反序列化:未被识别的字段“......”,未标记为可忽略

时间:2014-03-04 13:35:03

标签: java json jackson

我收到了以下错误,我发现没有解决方法对我有所帮助:

  

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

问题似乎是,服务返回带有大写字母的属性名称,而类属性以较低的字母开头。

我试过了:

  1. 将propertyNames更改为第一个大写字母 - 同样的错误
  2. @JsonProperty("SerialNo")添加到属性实例化 - 同样的错误
  3. @JsonProperty("SerialNo")添加到相应的getter - 同样的错误
  4. @JsonProperty("SerialNo")添加到相应的setter - 同样的错误
  5. 向所有人添加@JsonProperty("SerialNo")(只是为了好玩) - 同样的错误
  6. (注意:@JsonProperty("SerialNo")只是一个例子)

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

    这里的课程:(注意:不完整)

    @JsonIgnoreProperties(ignoreUnknown = true)
    public class GaugeDevice 
    {
        private int gaugeDeviceId;
        private Date utcInstallation;
        private String manufacturer;
        private float valueOffset;
        private String serialNo;
        private String comment;
        private int digitCount;
        private int decimalPlaces;
    
        @JsonProperty("SerialNo")
        public String getSerialNo() {
            return serialNo;
        }
    
        public void setSerialNo(String serialNo) {
            this.serialNo = serialNo;
        }
    
        @JsonProperty("Comment")
        public String getComment() {
            return comment;
        }
    
        public void setComment(String comment) {
            this.comment = comment;
        }
    

    这里的出路在哪里?请帮忙。

    修改

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

    import ccc.android.meterdata.*;
    
    import javax.ws.rs.client.Client;
    import javax.ws.rs.client.ClientBuilder;
    import javax.ws.rs.client.Invocation;
    import org.glassfish.jersey.jackson.JacksonFeature;
    
    public class RestClient
    {
        private String connectionUrl;
        private javax.ws.rs.client.Client client;
    
        public RestClient(String baseUrl) {
             client = ClientBuilder.newClient();;
             connectionUrl = baseUrl;
             client.register(JacksonFeature.class); 
        }
    
        public GaugeDevice GetGaugeDevice(int id){
    
            String uri = connectionUrl + "/GetGaugeDevice/" + id;
            Invocation.Builder bldr = client.target(uri).request("application/json");
            return bldr.get(GaugeDevice.class);
        }
    }
    

    我希望错误有根源吗?

7 个答案:

答案 0 :(得分:17)

我有同样的问题,我通过更改注释导入来解决它:

com.fasterxml.jackson.annotation.JsonIgnoreProperties

org.codehaus.jackson.annotate.JsonIgnoreProperties

不必定义任何NamingStrategy或ObjectMapper。

答案 1 :(得分:10)

我遇到了同样的问题,并通过更改

中的注释导入解决了这个问题
com.fasterxml.jackson.annotation.JsonProperty

org.codehaus.jackson.annotate.JsonProperty

答案 2 :(得分:8)

鉴于以下是您的错误:

  

无法识别的字段“GaugeDeviceId”(Class 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

编辑:版本信息

并不重要,因为我相信以上都是使用杰克逊的一些非常标准的东西,我使用 core-asl 1.9.13 版本和 mapper-asl


编辑:客户提供

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

我不确定,但我觉得我接近以下依赖设置(注意我正在使用maven)

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-processing</artifactId>
        <version>2.0</version>
    </dependency>

这些链接提供了配置信息:Link 1Link 2

答案 3 :(得分:8)

要检查的另一件事是PropertyNamingStrategy,这将允许Jackson使用“Pascal命名”并将JSON属性与POJO属性相匹配。请参见f.ex:http://www.javacodegeeks.com/2013/04/how-to-use-propertynamingstrategy-in-jackson.html

答案 4 :(得分:6)

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

例如:

@JsonIgnoreProperties(ignoreUnknown=true)
class Foo{
 ...
}

以上代码段将忽略任何未知属性。 (注释导入:org.codehaus.jackson.annotate.JsonIgnoreProperties)

答案 5 :(得分:0)

适用于我的解决方案如下

  1. 添加导入

    导入org.codehaus.jackson.map.DeserializationConfig;

  2. 配置ObjectMapper objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);

  3. 完整的解决方案

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

答案 6 :(得分:0)

将所有私有变量和成员设为 public 。杰克逊致力于研究公共成员变量。

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