[英]Jackson Json Deserialisation: Unrecognized field “…” , not marked as ignorable
我收到以下錯誤,我發現沒有解決方案對我有用:
無法識別的字段“GaugeDeviceId”(類 GaugeDevice),未標記為可忽略
問題似乎是,服務返回帶有前導大寫字母的屬性名稱,而類屬性以小寫字母開頭。
我試過了:
@JsonProperty("SerialNo")
到屬性實例化 - 同樣的錯誤@JsonProperty("SerialNo")
到相應的 getter - 同樣的錯誤@JsonProperty("SerialNo")
到相應的 setter - 同樣的錯誤@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-asl和mapper-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>
通過在類級別使用注釋,您可以在反序列化時忽略未知屬性。
例如 :
@JsonIgnoreProperties(ignoreUnknown=true)
class Foo{
...
}
上面的代碼段將忽略任何未知的屬性。 (注釋導入:org.codehaus.jackson.annotate.JsonIgnoreProperties)
對我有用的解決方案如下
添加導入
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 。 Jackson 處理公共成員變量。
public int gaugeDeviceId;
public Date utcInstallation;
....
或將公共 Getter 添加到私有字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.