Jackson中的自定义JSON反序列化,排除invalide数组

亚历克斯·马卡罗夫(Alex Makarov)

我以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;
    }
}

如果我遇到“错误”,它可以正常工作,但是当服务器说“确定”并且没有错误时,它会发送给我

{
"status": "OK",
"errors":[]
}

(不要问我是谁编写服务器的)Mapper崩溃了。我正在尝试编写一个自定义的JsonDeserializer(通用方法)

public abstract class ExcludeEmptyArrayDeserializer<T> extends JsonDeserializer<T> {

    private final Class<T> clazz;

    protected ExcludeEmptyArrayDeserializer(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        ObjectCodec oc = jp.getCodec();
        JsonNode node = oc.readTree(jp);

        if(node.has("errors")) {
            if (node.get("errors").isArray() && !node.get("errors").getElements().hasNext())
                ((ObjectNode)node).remove("errors");
        }

        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.readValue(node, clazz);   // doesn't work
        //return oc.treeToValue(node, clazz);   // doesn't work too
    }
}

public class StatusErrorsDeserializer extends ExcludeEmptyArrayDeserializer<StatusErrors> {
    public StatusErrorsDeserializer() {
        super(StatusErrors.class);
    }
}

结果用法代码有一个视图

    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);

“错误”节点已正确删除,但此解决方案仍然无法正常工作。我想我在JsonDeserializer.deserialize方法中犯了一个错误,但是不知道。

BTW StatusErrors类可以是服务器中其他复杂消息的基类。

伊利亚·奥维斯诺夫(Ilya Ovesnov)

最简单的解决方案是将错误变量声明更改为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;
    }
....

您不需要任何序列化器和反序列化器:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Jackson自定义JSON反序列化

Jackson JSON无法使用自定义根名称反序列化元素数组?

使用Jackson的自定义JSON序列化/反序列化

JSON.Net无法在自定义JsonConverter中反序列化JSON数组

如何在Jackson JSON(反序列化)中自定义序列化或转换具有自定义键类型的Map属性?

Jackson对多态对象的自定义反序列化

使用Jackson自定义反序列化列表

Go中接口的自定义JSON序列化和反序列化

Jackson-仅将自定义反序列化器用于特定的JSON

如何为Jackson编写自定义JSON反序列化器?

使用Jackson自定义反序列化JSON字段

在Java中使用Jackson进行JSON FIELD的自定义反序列化?

使用Jackson在Java中嵌套自定义反序列化

原始数组的自定义Gson反序列化

如何使用尊重自定义注释的Jackson来执行自定义JSON反序列化?

使用Jackson在反序列化JSON数组中反序列化JSON数组

Ktor自定义json对象反序列化

自定义反序列化

java-在自定义反序列化中调用标准反序列化

Jackson JSON反序列化:每行中的数组元素

某些字段的Jackson JSON自定义序列化

使用 JQuery 序列化和反序列化自定义对象数组

Jackson 的多态序列化/反序列化和自定义序列化器/反序列化器

使用Jackson进行自定义反序列化:扩展默认反序列化器

如何在C#中反序列化自定义json

使用JsonConverter在C#中自定义JSON反序列化

使用自定义转换器从流中反序列化Json

在Newtonsoft.Json中反序列化自定义异常

对Java中的自定义枚举值反序列化json响应