![](/img/trans.png)
[英]resolving com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field
[英]com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field
我有一个反序列化问题:
这是我的课:
public class Response {
private Object ResObj;
private int ResInt;
public Object getResObj() {
return ResObj;
}
public int getResInt() {
return ResInt;
}
}
我要反序列化的 JSON 是:
{"ResObj":{"ClientNum":"12345","ServerNum":"78945","IdNum":"020252"},"ResInt":0}
我得到这个例外:
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ResObj" , not marked as ignorable (0 known properties: ])
at [Source: java.io.StringReader@1f758500; line: 1, column: 20] (through reference chain: ["ResObj"])
我不想补充:
@JsonIgnoreProperties(ignoreUnknown = true)
因为我想得到 ResObj ...
如果我添加注释,它会通过但它会将其设置为 null .. 我不想要。
如果你不想在你的 bean 中有一个 setter 并且只使用字段和 getter,你可以使用ObjectMapper
的可见性检查器来允许字段可见性。
类似于以下内容:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setVisibility(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));
您需要 Setter 方法来允许 Jackson 设置属性,并且您需要将 json 中的字段更改为以小写字母开头:
public class Response {
private Object ResObj;
private int ResInt;
public Object getResObj() {
return ResObj;
}
public void setResObj(Object ResObj) {
this.ResObj = ResObj;
}
// ...
}
和:
{"resObj":{"clientNum":"12345","serverNum":"78945","idNum":"020252"},"resInt":0}
JSON 更改的原因是 Jackson bean 序列化将反映在类上,当它看到 getXyz() 和 setXyz() 方法时,会将这些映射到 Json 文件名称“xyz”(而不是“Xyz”)。
我认为有几种方法可以覆盖这种行为,一种是使用 Jackson 注释之一。
我想你应该试试这个
public class Response {
@JsonProperty
private Object ResObj;
@JsonProperty
private int ResInt;
public Object getResObj() {
return ResObj;
}
public int getResInt() {
return ResInt;
}
}
它将通过 UnrecognizedPropertyExceptions 解决您的问题
public class Response {
public Object ResObj;
public int ResInt;
public Object getResObj() {
return ResObj;
}
public int getResInt() {
return ResInt;
}
}
使用它来解决上述问题。
我已经使用 Jackson 库对这个问题进行了排序。 这是我的代码片段。
**Main Class with JSON String in all lower case:**
public class MainClass {
public static void main(String[] args) throws JsonParseException,
JsonMappingException, IOException {
String jsonStr = "{\r\n" + " \"resObj\": {\r\n" + " \"clientNum\":
\"12345\",\r\n"
+ " \"serverNum\": \"78945\",\r\n" + " \"idNum\":
\"020252\"\r\n" + " },\r\n"
+ " \"resInt\": 0\r\n" + "}";
ObjectMapper mapper = new ObjectMapper();
MyPojo details = mapper.readValue(jsonStr, MyPojo.class);
System.out.println("value of clientNum: " + details.getResObj().getClientNum());
System.out.println("value of getServerNum: " +
details.getResObj().getServerNum());
System.out.println("value of getIdNum: " + details.getResObj().getIdNum());
System.out.println("value of getResInt: " + details.getResInt());
} }
**MyPojo Class:**
public class MyPojo {
private ResObj resObj;
private String resInt;
public ResObj getResObj() {
return resObj;
}
public String getResInt() {
return resInt; } }
**ResObj class:**
public class ResObj {
private String serverNum;
private String idNum;
private String clientNum;
public String getServerNum() {
return serverNum;
}
public String getIdNum() {
return idNum;
}
public String getClientNum() {
return clientNum;
} }
**RESULT**
value of clientNum: 12345
value of getServerNum: 78945
value of getIdNum: 020252
value of getResInt: 0
NOTE: I have removed Setters in classes & there is no effect on the result.
我想以上,但在我的案件中提到的所有方面,这仅仅是担任回答解决此解决方案2.在这里,我已经启用@EnableWebMvc
在我的春天启动应用程序。
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Autowired
private ObjectMapper objectMapper;// created elsewhere
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// this will add a 2nd MappingJackson2HttpMessageConverter
converters.add(new MappingJackson2HttpMessageConverter(this.objectMapper));
}
}
您需要为 ResObj {"ClientNum":"12345","ServerNum":"78945","IdNum":"020252"} 中的信息定义另一个类。 否则杰克逊无法确定如何反序列化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.