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

21
我遇到了以下错误,而我找到的解决方法都无法解决我的问题:

Unrecognized field "GaugeDeviceId" (Class GaugeDevice), not marked as ignorable

问题看起来是出在服务返回属性名的首字母大写,而类属性的首字母是小写。
我尝试了以下方法:
  1. 将属性名称更改为首字母大写-仍然出现相同的错误
  2. 在属性实例化中添加 @JsonProperty("SerialNo") - 仍然出现相同的错误
  3. 在相应的getter方法中添加 @JsonProperty("SerialNo") - 仍然出现相同的错误
  4. 在相应的setter方法中添加 @JsonProperty("SerialNo") - 仍然出现相同的错误
  5. 在所有方法中都添加 @JsonProperty("SerialNo") (只是为了好玩)- 仍然出现相同的错误
(注意: @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个回答

18

我遇到了同样的问题,并通过更改注释导入解决了它,更改前的代码如下:

com.fasterxml.jackson.annotation.JsonIgnoreProperties
org.codehaus.jackson.annotate.JsonIgnoreProperties

不需要定义任何NamingStrategy或ObjectMapper。


谢谢,我也遇到了同样的错误,INTELIJ IDE没有询问选择,自动设置了错误的选项。 - Kamil Nękanowicz

11

我遇到了同样的问题,并通过更改注释导入方式来解决它

com.fasterxml.jackson.annotation.JsonProperty
org.codehaus.jackson.annotate.JsonProperty

9

8
以下是您的错误信息:

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

我相信您需要对属性执行与属性相同的操作。
@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中的一些非常标准的东西,但并不重要,我正在使用core-aslmapper-asl库的1.9.13版本。


编辑:客户端提供的

我想知道这是否与这个问题有关?我认为解决方案是您正在使用的依赖项配置。

我不确定,但我觉得以下依赖项设置非常接近(请注意,我正在使用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>

以下链接提供了配置信息: 链接1链接2


是的,有这个问题。我的代码只是一个片段。 我已经尝试过了,但没有成功。 - chile
@chile 能否添加反序列化对象的代码?如果您的 GaugeDevice 有正确的注释,那么它应该可以工作,如果 ObjectMapper 没有包含任何自定义 (de)serializers。 - Dan Temple
客户端类已添加...可能我正在使用某些已过时的内容? - chile

6
您可以通过在类级别使用注释来在反序列化时忽略未知属性。
例如:
@JsonIgnoreProperties(ignoreUnknown=true)
class Foo{
 ...
}

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

2
将所有的私有变量和成员变量改为公共的。Jackson只能处理公共成员变量。
public int gaugeDeviceId;
public Date utcInstallation; 
....

或者将私有字段添加公共Getter方法。

1
我成功使用的解决方案如下:
  1. Add the import

    import org.codehaus.jackson.map.DeserializationConfig;
    
  2. Configure the ObjectMapper

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
    
  3. The complete solution

    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;
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接