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

问题是如何将 JSON对象数组映射到java.util.Map,其中每个键将是对象的一些指定属性,该值是对象本身.
JSON:
{"items": [{"field1": 1,"field2": "Hello"},{"field1": 2,"field2":"World"}]}

Java POJO:

public class Storage {
    private Map<Integer,Item> items;
}

public class Item {
    private Integer field1;
    private String field2;
}

那么有什么方法可以指定ObjectMapper,当将数组的数组反序列化到Map时,应该使用每个JSON对象的field1属性作为关键字?

解决方法

如何反序列化JSON字符串

您可以使用Jackson来反序列化JSON字符串:

例如,如果你有类Foo

public class Foo {

   private Bar[] items;

   // Constructor / Getters & Setters

}

那个类有一个类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>

解决问题的方法

Option 1 – Custom Deserializer

编写一个自定义的JsonDeserializer来将您的JSON字符串反序列化为一个存储对象,其字段项类型为Map< String,Item>

public class CustomDeserializer extends JsonDeserializer<Storage> {

    @Override
    public Storage deserialize(JsonParser jsonParser,DeserializationContext deserializationContext)
            throws IOException {

        Map<Integer,Item> map = new HashMap<>();

        ObjectCodec oc = jsonParser.getCodec();
        JsonNode rootNode = oc.readTree(jsonParser);
        JsonNode items = rootNode.get("items");

        for (int i = 0; i < items.size(); i++) {

            JsonNode childNode = items.get(i);

            Item item = new Item(childNode.get("field1").asInt(),childNode.get("field2").asText());

            map.put(item.getField1(),item);
        }

        return new Storage(map);
    }
}

然后,您将使用以下内容对Storage类进行注释:

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

   ...

}

Option 2 – Create Map post deserialization

将JSON字符串反序列化为具有如开头所述的Item数组的Storage对象,然后构造您的Map< Integer,Item>后.

希望这可以帮助.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...