问题是如何将JSON对象数组映射到java.util.Map
,其中每个键都是对象的某些指定属性,值就是对象本身。
杰森:
{"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
属性作为键
发布于 2015-11-25 11:06:05
如何反序列化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>
解决问题的方法:
选项1-自定义反序列化器
编写自定义JsonDeserializer
,将JSON字符串反序列化为Storage
对象,其字段为Map<String,Item>
类型的items
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)
您的Storage
类看起来类似于;
@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>
。
希望这能有所帮助。
发布于 2015-11-25 11:21:36
您可以创建自己的自定义序列化程序/反序列化器来实现这一点。杰克逊提供了一种简洁的方法来做到这一点。只需使用@JsonDeserialize(使用= YourDeserializer.class)注释存储类,并具有在YourDeserializer中转换json的逻辑。
发布于 2015-11-25 13:10:40
JSON对象的数组是一个条目数组,对吗?那么,为什么不简单地将数组反序列化为Java数组中的项,然后从那里构建Map呢?
https://stackoverflow.com/questions/33914460
复制相似问题