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
key
是name
的值,而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语法不正确:它以方括号([
)开头,以花括号(}
)结尾,这在技术上是不可解析的。
假设你想要一个Map
s数组(例如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
使用 Spring 和 Jackson JSON 将 java.io.Serializable 实例序列化为 JSON [重复]
在将 json 反序列化为对象时,使用 jackson 将 asp.net / MS 专有 json Dateformat 转换为 java8 LocalDateTime