Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson中的自定义JSON反序列化,排除无效数组_Java_Json_Jackson_Deserialization - Fatal编程技术网

Java Jackson中的自定义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

我接收JSON格式的数据

{
"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=[])