簡體   English   中英

Jackson Json 反序列化:無法識別的字段“...”,未標記為可忽略

[英]Jackson Json Deserialisation: Unrecognized field “…” , not marked as ignorable

我收到以下錯誤,我發現沒有解決方案對我有用:

無法識別的字段“GaugeDeviceId”(類 GaugeDevice),未標記為可忽略

問題似乎是,服務返回帶有前導大寫字母的屬性名稱,而類屬性以小寫字母開頭。

我試過了:

  1. 將 propertyNames 更改為第一個大寫字母 - 同樣的錯誤
  2. @JsonProperty("SerialNo")到屬性實例化 - 同樣的錯誤
  3. @JsonProperty("SerialNo")到相應的 getter - 同樣的錯誤
  4. @JsonProperty("SerialNo")到相應的 setter - 同樣的錯誤
  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);
    }
}

我希望錯誤的根源在這里?

我遇到了同樣的問題,我通過更改注釋導入來解決它:

com.fasterxml.jackson.annotation.JsonIgnoreProperties

org.codehaus.jackson.annotate.JsonIgnoreProperties

不必定義任何 NamingStrategy 或 ObjectMapper。

我遇到了同樣的問題並通過更改注釋導入來解決它

com.fasterxml.jackson.annotation.JsonProperty

org.codehaus.jackson.annotate.JsonProperty

另一件要檢查的事情是PropertyNamingStrategy ,它允許 Jackson 使用“Pascal 命名”並將 JSON 屬性與 POJO 屬性匹配。 請參閱此處的 f.ex: http : //www.javacodegeeks.com/2013/04/how-to-use-propertynamingstrategy-in-jackson.html

鑒於以下是您的錯誤:

無法識別的字段“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 的一些非常標准的東西,我使用的是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>

這些鏈接提供了配置信息: Link 1 , Link 2

通過在類級別使用注釋,您可以在反序列化時忽略未知屬性。

例如 :

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

上面的代碼段將忽略任何未知的屬性。 (注釋導入:org.codehaus.jackson.annotate.JsonIgnoreProperties)

對我有用的解決方案如下

  1. 添加導入

    import org.codehaus.jackson.map.DeserializationConfig;
  2. 配置對象映射器

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
  3. 完整的解決方案

    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 Jackson 處理公共成員變量。

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

或將公共 Getter 添加到私有字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM