Java Jackson Json反序列化:无法识别的字段“&引用,不可忽视的
我得到了以下错误,但我发现没有解决方法: 无法识别的字段“GaugeDeviceId”(类别GaugeDevice),未标记为可忽略 问题似乎在于,服务返回的属性名称以大写字母开头,而类属性以小写字母开头 我试过:Java Jackson Json反序列化:无法识别的字段“&引用,不可忽视的,java,json,jackson,Java,Json,Jackson,我得到了以下错误,但我发现没有解决方法: 无法识别的字段“GaugeDeviceId”(类别GaugeDevice),未标记为可忽略 问题似乎在于,服务返回的属性名称以大写字母开头,而类属性以小写字母开头 我试过: 将PropertyName更改为第一个大写字母-相同错误 将@JsonProperty(“SerialNo”)添加到属性实例化-相同错误 将@JsonProperty(“SerialNo”)添加到相应的getter-相同的错误 将@JsonProperty(“SerialNo”)添加
@JsonProperty(“SerialNo”)
添加到属性实例化-相同错误@JsonProperty(“SerialNo”)
添加到相应的getter-相同的错误@JsonProperty(“SerialNo”)
添加到相应的设置程序-相同错误@JsonProperty(“SerialNo”)
添加到它们中(只是为了好玩)-相同的错误@JsonProperty(“SerialNo”)
只是一个例子)
奇怪的是,注释:@JsonIgnoreProperties(ignoreUnknown=true)
应该准确地抑制该错误,但它仍在触发
这里是课堂:(注:不完整)
出去的路在哪里?请帮忙
编辑:
下面是客户机类:(只是一个简单的测试客户机)
我希望错误的根源在这里?因为以下是您的错误: 无法识别的字段“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)
javax.ws.rs
,另一件要检查的事情是PropertyNamingStrategy
,它允许Jackson使用“Pascal命名”并将JSON属性与POJO属性匹配。请参见此处的f.ex:我也遇到了同样的问题,我通过将注释导入更改为:
com.fasterxml.jackson.annotation.JsonIgnoreProperties
到
无需定义任何NamingStrategy或ObjectMapper。在类级别使用注释进行反序列化时,可以忽略未知属性
例如:
@JsonIgnoreProperties(ignoreUnknown=true)
class Foo{
...
}
上面的代码段将忽略任何未知属性。
(注释导入:org.codehaus.jackson.annotate.JsonIgnoreProperties)我遇到了同样的问题,通过将注释导入从
com.fasterxml.jackson.annotation.JsonProperty
到
对我有效的解决方案如下
添加导入
import 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);
String jsonInString = objectMapper.writeValueAsString(eje);
Eje newElement = objectMapper.readValue(jsonInString, Eje.class);
this.eje = newElement;
将所有私有变量和成员设置为公共。Jackson处理公共成员变量
public int gaugeDeviceId;
public Date utcInstallation;
....
是的,有。我的代码只是一个外卖。我已经试过了,但没有成功。@chile那么你能添加反序列化对象的代码吗?如果您的GaugeDevice
具有正确的注释,那么如果ObjectMapper
不包含任何自定义(反)序列化程序,则它应该可以工作。添加了客户端类。。。也许我用了不推荐的东西?谢谢,我也有同样的错误,INTELIJ IDE不询问选择,自动设置错误。
org.codehaus.jackson.annotate.JsonProperty
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 int gaugeDeviceId;
public Date utcInstallation;
....