我收到了以下错误,我发现没有解决方法对我有所帮助:
无法识别的字段“GaugeDeviceId”(Class 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);
}
}
我希望错误有根源吗?
答案 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>
答案 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)
适用于我的解决方案如下
添加导入
导入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);
字符串jsonInString = objectMapper.writeValueAsString(eje);
Eje newElement = objectMapper.readValue(jsonInString,Eje.class);
this.eje = newElement;
答案 6 :(得分:0)
将所有私有变量和成员设为 public 。杰克逊致力于研究公共成员变量。
public int gaugeDeviceId;
public Date utcInstallation;
....