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

问题描述 投票:2回答:1

我试图使用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();
}

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

java json jackson
1个回答
1
投票

您可以使用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");
        }
    }
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.