Jackson从JSON中的变量类型反序列化

亚当·沃基奇:

我正在尝试使用Jackson来反序列化JSON,Jackson包含一个项目列表,其中各个列表项目可以是String或它们可以是Strings的子列表。处理这种情况的首选方式是什么?

示例Json:

"anObject" : {
    "stuff": [
        "a",
        "b",
        ["x","y","z"]
    ]
}

我得到它与以下工作:

public AnObject {
    private List<Object> stuff;
}

TypeReference<HashMap<String, List<AnObject>>> typeRef =
        new TypeReference<HashMap<String, List<AnObject>>>() {};
try {
    HashMap<String, List<AnObject>> map = mapper.readValue(json, typeRef);
} catch (IOException e) {
    e.printStackTrace();
}

但是,我觉得这不是理想的方法。有人可以跟我分享我如何更好地应对吗?提前致谢!

马克·普罗布斯特(Mark Probst):

您可以使用quicktype生成反序列化的代码。基本上,您必须为“字符串或字符串数​​组”类型编写自己的反序列化器:

package io.quicktype;

import java.util.Map;
import java.io.IOException;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.*;

@JsonDeserialize(using = Stuff.Deserializer.class)
@JsonSerialize(using = Stuff.Serializer.class)
public class Stuff {
    public String stringValue;
    public String[] stringArrayValue;

    static class Deserializer extends JsonDeserializer {
        @Override
        public Stuff deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            Stuff value = new Stuff();
            switch (jsonParser.getCurrentToken()) {
            case VALUE_STRING:
                value.stringValue = jsonParser.readValueAs(String.class);
                break;
            case START_ARRAY:
                value.stringArrayValue = jsonParser.readValueAs(String[].class);
                break;
            default: throw new IOException("Cannot deserialize Stuff");
            }
            return value;
        }
    }

    static class Serializer extends JsonSerializer {
        @Override
        public void serialize(Stuff obj, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            if (obj.stringValue != null) {
                jsonGenerator.writeObject(obj.stringValue);
                return;
            }
            if (obj.stringArrayValue != null) {
                jsonGenerator.writeObject(obj.stringArrayValue);
                return;
            }
            throw new IOException("Stuff must not be null");
        }
    }
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

如何在Jackson中对具有抽象类型的引用进行反序列化JSON

使用Jackson将Java中的JSON反序列化

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

在jackson中反序列化bson long原始json

Jackson Json反序列化视图

反序列化各种JSON类型

反序列化动态json类型

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

如何在angular2 +中序列化/反序列化.NET类型的JSON

使用PHP中的类型将嵌套对象序列化/反序列化为JSON

动态类型的Jackson多态反序列化

多种类型的 Jackson 反序列化接口

如何使用Jackson反序列化空类型JSON字段

具有不同类型的字段的 JSON 反序列化(使用 Jackson 和 Scala)

JSON/Jackson:没有类型字段的递归多态反序列化

如何使用Jackson来反序列化对象变量?

从包装器类中的类型反序列化Jackson中的动态实体

杰克逊(Jackson)反序列化变量为杰森(Json)字符串

反序列化具有关键变量 jackson map ObjectMapper 的 JSON

在Jackson中反序列化具有相同名称但不同类型的属性?

Ruby中的JSON反序列化

使用Jackson将反序列化JSON数组反序列化为Map

使用Jackson将反序列化JSON数组反序列化为单个Java对象

如何使用Jackson将反序列化的JSON反序列化为忽略键的对象?

用Jackson对多态类反序列化JSON

用Jackson和@JsonCreator反序列化JSON

用Jackson进行JSON反序列化

Jackson Json将对象反序列化到列表