Java Jackson中的自定义JSON反序列化,排除无效数组
我接收JSON格式的数据Java Jackson中的自定义JSON反序列化,排除无效数组,java,json,jackson,deserialization,Java,Json,Jackson,Deserialization,我接收JSON格式的数据 { "status": "INVALID_DATA", "errors":{ "invalid_id": "Id isn't available", ... "wrong_address": "Address error msg" } } 键及其在结构“错误”中的数量对我来说是未知的。我正试着把它和课堂联系起来 @JsonIgnoreProperties(ignoreUnknown = true) publ
{
"status": "INVALID_DATA",
"errors":{ "invalid_id": "Id isn't available",
...
"wrong_address": "Address error msg"
}
}
键及其在结构“错误”中的数量对我来说是未知的。我正试着把它和课堂联系起来
@JsonIgnoreProperties(ignoreUnknown = true)
public class StatusErrors
{
private String status;
private HashMap<String, String> errors = new HashMap<String, String>();
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public HashMap<String, String> getErrors() {
return errors;
}
public void setErrors(HashMap<String, String> errors) {
this.errors = errors;
}
}
(不要问我是谁写的服务器)
所以mapper崩溃了。
我正在尝试编写一个自定义JsonDeserializer(通用方式)
“错误”节点已正确删除,但此解决方案仍不起作用。
我想我在JsonDeserializer.deserialize方法中犯了一个错误,但我不知道
顺便说一句,StatusErrors类可以是来自服务器的其他复杂消息的基类。最简单的解决方案是将errors变量声明更改为Object:
@JsonIgnoreProperties(ignoreUnknown = true)
class StatusErrors {
private String status;
private Object errors;
public Map<String, String> getErrorsMap() {
if (this.errors instanceof Map) {
return (Map)this.errors;
}
return null;
}
....
上面的代码将打印:
StatusErrors(status=INVALID_DATA, errors={invalid_id=Id isn't available, wrong_address=Address error msg})
class java.util.LinkedHashMap
{invalid_id=Id isn't available, wrong_address=Address error msg}
StatusErrors(status=OK, errors=[])
SimpleModule module = new SimpleModule("", Version.unknownVersion());
module.addDeserializer(StatusErrors.class, new StatusErrorsDeserializer());
ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY).withModule(module);
MappingJacksonHttpMessageConverter messageConverter = new MappingJacksonHttpMessageConverter();
messageConverter.setObjectMapper(mapper);
getRestTemplate().getMessageConverters().clear();
getRestTemplate().getMessageConverters().add(messageConverter);
@JsonIgnoreProperties(ignoreUnknown = true)
class StatusErrors {
private String status;
private Object errors;
public Map<String, String> getErrorsMap() {
if (this.errors instanceof Map) {
return (Map)this.errors;
}
return null;
}
....
ObjectMapper objectMapper = new ObjectMapper();
StatusErrors result1 = objectMapper.readValue(JSON1, StatusErrors.class);
System.out.println(result1);
System.out.println(result1.getErrors().getClass());
System.out.println(result1.getErrorsMap());
StatusErrors result2 = objectMapper.readValue(JSON2, StatusErrors.class);
System.out.println(result2);
StatusErrors(status=INVALID_DATA, errors={invalid_id=Id isn't available, wrong_address=Address error msg})
class java.util.LinkedHashMap
{invalid_id=Id isn't available, wrong_address=Address error msg}
StatusErrors(status=OK, errors=[])