将JSON对象数组映射到java.util.Map,反之亦然

将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; } 公共类存储{ 私人地图项目; } 公共类项目{ 私有整数字

问题是如何将JSON对象数组映射到
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字符串:

例如,如果您有class
Foo

public class Foo {

   private Bar[] items;

   // Constructor / Getters & Setters

} 
这个类有一个class
Bar

 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;
   }

   ...

}