如何反序列化 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
带有字段的对象items
类型的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)
Your Storage
类看起来像这样;
@JsonDeserialize(using = CustomDeserializer.class)
public class Storage {
private Map<Integer, Item> items;
public Storage(Map<Integer, Item> map) {
this.items = map;
}
...
}
选项 2 - 反序列化后创建地图
将 JSON 字符串反序列化为Storage
具有数组的对象Item
如开头所述,然后构建您的Map<Integer, Item>
after.
希望这可以帮助。