问题是如何将
JSON对象数组映射到java.util.Map,其中每个键将是对象的一些指定属性,该值是对象本身.
JSON:
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>后.
希望这可以帮助.