Java Jackson将JSON序列化为HashTable

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

我试图序列化一个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

java json serialization jackson
3个回答
0
投票

我不认为这是可能的。

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


0
投票

创建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));

0
投票

首先,你可能不想使用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[]。直到下一次编辑,我猜......

© www.soinside.com 2019 - 2024. All rights reserved.