将JSON对象数组映射到java.util.Map,反之亦然
问题是如何将JSON对象数组映射到将JSON对象数组映射到java.util.Map,反之亦然,java,json,fasterxml,Java,Json,Fasterxml,问题是如何将JSON对象数组映射到java.util.map,其中每个键都是对象的某个指定属性,值是对象本身。 JSON: Java POJO: public class Storage { private Map<Integer, Item> items; } public class Item { private Integer field1; private String field2; } 公共类存储{ 私人地图项目; } 公共类项目{ 私有整数字
java.util.map
,其中每个键都是对象的某个指定属性,值是对象本身。
JSON:
Java POJO:
public class Storage {
private Map<Integer, Item> items;
}
public class Item {
private Integer field1;
private String field2;
}
公共类存储{
私人地图项目;
}
公共类项目{
私有整数字段1;
私有字符串字段2;
}
那么,是否有某种方法可以指定
ObjectMapper
在将项数组反序列化到Map
时,它应该使用每个JSON对象的field1
属性作为键 如何反序列化JSON字符串
您可以使用Jackson反序列化JSON字符串:
例如,如果您有classFoo
public class Foo {
private Bar[] items;
// Constructor / Getters & Setters
}
这个类有一个classBar
public class Bar {
private int field1;
private String field2;
// Constructor / Getters & Setters
}
如果字段名与JSON字符串中的字段名匹配,则可以执行以下操作进行转换:
String jsonString = "{\"items\": [{\"field1\": 1, \"field2\": \"Hello\"}, {\"field1\": 2, \"field2\":\"World\"}]}";
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(jsonString, Foo.class);
如果您使用的是Maven,则pom.xml中需要以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
然后,您将使用以下内容注释存储
类:
@JsonDeserialize(using = CustomDeserializer.class)
你的存储
类看起来像
@JsonDeserialize(using = CustomDeserializer.class)
public class Storage {
private Map<Integer, Item> items;
public Storage(Map<Integer, Item> map) {
this.items = map;
}
...
}
@JsonDeserialize(使用=CustomDeserializer.class)
公共类存储{
私人地图项目;
公共存储(地图){
this.items=map;
}
...
}
选项2-创建映射后反序列化
如开头所述,将JSON字符串反序列化为存储
对象和项
数组,然后构建映射
希望这有帮助。您可以创建自己的自定义序列化程序/反序列化程序来实现这一点。Jackson提供了一种简洁的方法。只需使用@JsonDeserialize(使用=YourDeserializer.class)对存储类进行注释,并在您的Deserializer中转换json的逻辑。json对象数组是一个项目数组,对吗?那么,为什么不简单地将数组反序列化为项目的Java数组,然后从中构建映射呢?这并不能解决我的问题。我知道,如果项
只是一个数组或某个集合
,如何反序列化JSON对象。再次:我想使用映射将项
反序列化为映射
,其中key是存储在value中的对象的属性。因为在我的例子中,有一个底层泛型源(DAO),它在后台使用ObjectMapper
具有所有序列化/反序列化逻辑。我不想在那里改变任何事情。目前,使用自定义序列化器/反序列化器的解决方案似乎是实现我想要的唯一方法。。。
@JsonDeserialize(using = CustomDeserializer.class)
@JsonDeserialize(using = CustomDeserializer.class)
public class Storage {
private Map<Integer, Item> items;
public Storage(Map<Integer, Item> map) {
this.items = map;
}
...
}