首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将JSON对象数组映射到java.util.Map,反之亦然

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

Stack Overflow用户
提问于 2015-11-25 10:45:41
回答 3查看 10.1K关注 0票数 10

问题是如何将JSON对象数组映射到java.util.Map,其中每个键都是对象的某些指定属性,值就是对象本身。

杰森:

代码语言:javascript
运行
复制
{"items": [{"field1": 1, "field2": "Hello"}, {"field1": 2, "field2":"World"}]}

Java POJO:

代码语言:javascript
运行
复制
public class Storage {
    private Map<Integer, Item> items;
}

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

那么,在将项数组反序列化为ObjectMapper时,是否有一种方法可以指定给Map,它应该使用每个JSON对象的field1属性作为键

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-25 11:06:05

如何反序列化JSON字符串

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

例如,如果您有类Foo

代码语言:javascript
运行
复制
public class Foo {

   private Bar[] items;

   // Constructor / Getters & Setters

} 

这个类有一个Bar类数组。

代码语言:javascript
运行
复制
 public class Bar {

     private int field1;
     private String field2;


     // Constructor / Getters & Setters

 }

如果字段名与JSON字符串中的字段名匹配,那么您可以执行以下操作来转换它:

代码语言:javascript
运行
复制
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中将需要以下依赖项:

代码语言:javascript
运行
复制
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>

解决问题的方法:

选项1-自定义反序列化器

编写自定义JsonDeserializer,将JSON字符串反序列化为Storage对象,其字段为Map<String,Item>类型的items

代码语言:javascript
运行
复制
 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类:

代码语言:javascript
运行
复制
@JsonDeserialize(using = CustomDeserializer.class)

您的Storage类看起来类似于;

代码语言:javascript
运行
复制
@JsonDeserialize(using = CustomDeserializer.class)
public class Storage {

   private Map<Integer, Item> items;

   public Storage(Map<Integer, Item> map) {
    this.items = map;
   }

   ...

}

选项2-创建Map post反序列化

如前面所述,将JSON字符串反序列化为一个具有Storage数组的Item对象,然后构建您的Map<Integer, Item>

希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2015-11-25 11:21:36

您可以创建自己的自定义序列化程序/反序列化器来实现这一点。杰克逊提供了一种简洁的方法来做到这一点。只需使用@JsonDeserialize(使用= YourDeserializer.class)注释存储类,并具有在YourDeserializer中转换json的逻辑。

票数 1
EN

Stack Overflow用户

发布于 2015-11-25 13:10:40

JSON对象的数组是一个条目数组,对吗?那么,为什么不简单地将数组反序列化为Java数组中的项,然后从那里构建Map呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33914460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档