杰克逊 Json 反序列化:无法识别的字段"...",未标记为可忽略



我得到了以下错误,我没有找到任何解决方案:

无法识别的字段"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的一些非常标准的东西,我使用的是核心asl映射程序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

通过在类级别使用注释,可以在反序列化时忽略未知属性。

例如:

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

上面的代码段将忽略任何未知的属性。(注释导入:org.codehaus.ackson.anntate.JsonIgnoreProperties)

将所有私有变量和成员设为公共。Jackson研究公共成员变量。

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

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

对我有效的解决方案是以下

  1. 添加导入

    import 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);     
    String jsonInString = objectMapper.writeValueAsString(eje); 
    Eje newElement = objectMapper.readValue(jsonInString, Eje.class); 
    this.eje = newElement;
    

相关内容

最新更新