杰克逊从JSON中的变量类型反序列化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杰克逊从JSON中的变量类型反序列化相关的知识,希望对你有一定的参考价值。

我试图使用Jackson反序列化JSON,其中包含一个项目列表,其中单个列表项可以是字符串,或者它们可以是字符串的子列表。处理这种情况的首选方法是什么?

示例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();
}

但是,我觉得这不是理想的方式。有人可以与我分享我如何更好地处理这个问题吗?提前致谢!

答案

您可以使用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");
        }
    }
}

以上是关于杰克逊从JSON中的变量类型反序列化的主要内容,如果未能解决你的问题,请参考以下文章

使用杰克逊的 JSON 反序列化:没有找到适合类型的构造函数 - 可以提供默认构造函数或注释构造函数 [重复]

反序列化杰克逊中同名但不同类型的属性?

无法使用杰克逊反序列化包含 2 个具有相同 ID 的对象的 Json

杰克逊错误:没有适合简单类的构造函数

JSON杰克逊序列化反序列化列表列表

阻止杰克逊改变变量名的大小写