Java Jackson将JSON序列化为HashTable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Jackson将JSON序列化为HashTable相关的知识,希望对你有一定的参考价值。

我试图序列化一个JSON blob列表,并在序列化过程中将某些键放入HashTable。这是我的JSON的一个例子:

[
    {
        "name": "sally",
        "id": 1,
        "eye_color": "green"
    },
    {
        "name": "jack",
        "id": 2,
        "eye_color": "blue"
    },
    {
        "name": "jane",
        "id": 3,
        "eye_color": "brown"
    }
]

我特别想要的是一个POJO(或一组POJO)可以像杰克逊一样序列化上面的JSON,假设上面的JSON在一个名为above_json.json的文件中:

MyPOJO pojo = objectMapper.readValue(new File("above_json.json"), MyPOJO.class);

我希望序列化的结果给我一个HashTable(或Object封装HashTable),其中HashTable keyname的值,而Hashtable value是上面相应的id的值。

假设我们以这种方式序列化了上面的JSON,我想像这样访问HashTable

myTable.get("jane")

结果:3

myTable.get("jack")

结果:2

myTable.get("Jill")

结果:null

我知道如何用Jackson序列化基本的JSON。我有一个例子如下:

JSON输入:

"Parameter":{
    "Name":"Parameter-Name",
    "Value":"Parameter-Value"
}

POJO序列化以上简单的JSON:

public class Parameter {
    @JsonProperty("Name")
    public String name;
    @JsonProperty("Value")
    public String value; 
}

但显然这种类型的设置并没有将结果放入HashTable。我需要一个像我在这个例子中所拥有的POJO,它将JSON直接序列化为HashTable

答案

我不认为这是可能的。

您将此json序列化为pojos列表,并具有实用程序功能,以便从pojos列表中以您希望的方式生成哈希表。

另一答案

创建POJO以保存您感兴趣的属性。

@JsonIgnoreProperties(ignoreUnknown = true)
private static class MyPOJO {
    @JsonProperty("name")
    private String name;
    @JsonProperty("id")
    private Integer id;

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

将文件的内容反序列化为List<MyPOJO>

 List<MyPOJO> myPOJO = mapper.readValue(new File(".."), new TypeReference<List<MyPOJO>>(){});

流式传输地图内容以构建一个地图,其关键是name,值为id

Map<String, Integer> map = myPOJO.stream()
            .collect(Collectors.toMap(MyPOJO::getName, MyPOJO::getId));
另一答案

首先,你可能不想使用HashTable,因为它被认为是一种过时的类型(参见here)。

使用HashMap或者如果你想要线程安全,ConcurrentHashMap或线程不安全的Map支持Collections.synchronized[...]并在synchronized声明中引用。

其次,您可以使用TypeReference反序列化为您想要的类型。

最后,您的JSON语法不正确:它以方括号([)开头,以花括号(})结尾,这在技术上是不可解析的。

假设你想要一个Maps数组(例如HashMap<String, String>[]),这里有一些合适的代码,前提是你用方形代替最后一个花括号:

// the map array
Map<String, String>[] map = null;
map = om.readValue(yourFile, new TypeReference<HashMap<String, String>[]>() {});
// prints the de-serialized contents
System.out.println(Arrays.toString(map));

编辑

由于您现在已经编辑了JSON以删除第一个方括号并用大括号替换它,因此您不能将其解析为Map

编辑2

由于您现在已经重新编辑了JSON以再次使用方括号而不是包装对象中的大括号,因此您可以再次反序列化为Map[]。直到下一次编辑,我猜......

以上是关于Java Jackson将JSON序列化为HashTable的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Jackson ObjectMapper 将 Json 序列化为 Java 对象

Java Jackson将JSON序列化为HashTable

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

使用 Spring 和 Jackson JSON 将 java.io.Serializable 实例序列化为 JSON [重复]

在将 json 反序列化为对象时,使用 jackson 将 asp.net / MS 专有 json Dateformat 转换为 java8 LocalDateTime

Jackson 将日期字符串反序列化为 Long