如何在JSON中存储要在Java中反序列化的键值对?

时间:2016-09-06 00:44:38

标签: java json jackson gson

我有像JSON这样的数据:

{
    "foo": "bar",
    "key": true,
    "otherKey": 10
}

键是String,值是基元(int,float,double,long等)或String。我想为上面的每一个都提供一个简单的无铸造包装。

这是我的包装类:

public final class Wrapper<T> {

    private String key;
    private T value;

}

如果我在要反序列化的对象中指定Wrapper[] wrappedValues,我可以(使用Jackson或GSON)将地图反序列化为包装器列表吗?

感谢您的回复!

1 个答案:

答案 0 :(得分:2)

首先,您指定的输入永远不能反序列化为数组或集合,因为它不是一个。一组键值的json集合看起来像这样

[
    {"foo": "bar"},
    {"key": true},
    {"otherKey": 10}
] 

如果您按照此类进行操作,可以将其反序列化为Wrappers的集合

public class Wrapper<T> {
    private String key;
    private T value;
    @JsonAnySetter
    public void set(String key, Object value) {
        this.key = key;
        this.value = (T)value;
    }
    public String toString() {  // just for nice printing
        return key + "=" + value.toString();
    }
}

然后你必须告诉Jackson什么是将托管反序列化json的集合的泛型类型:

public static void main(String[] args)
{
    String str = "[ {\"foo\": \"bar\"}, {\"key\": true}, {\"otherKey\": 10} ]";

    try (InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8"))) {
        ObjectMapper objectMapper = new ObjectMapper();
        JavaType listWrappersType = objectMapper.getTypeFactory()
                .constructCollectionType(List.class, Wrapper.class);
        List<Wrapper> list = objectMapper.readValue(is, listWrappersType);
        System.out.println(list);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

输出:

[foo=bar, key=true, otherKey=10]

如果您只想加载键值对而不用担心值类型,那么使用Jackson,您可以将其全部加载到Map<String, ?>

    public static void main(String[] args)
    {
        String str = "{ \"foo\": \"bar\", \"key\": true, \"otherKey\": 10 }";
        try (InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8")))  {
            Map<String, ?> map = new ObjectMapper().readValue(is, Map.class);
            // print map contents
            System.out.println(map);
            // print type of map values
            System.out.print(entry.getKey() + "=" + entry.getValue().getClass()+ ", "));
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

输出

{foo=bar, key=true, otherKey=10}
foo=class java.lang.String, key=class java.lang.Boolean, otherKey=class java.lang.Integer,