如何反序列化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中将需要以下依赖关系:
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
解决问题的方法:
Option 1 – Custom Deserializer
编写一个自定义的JsonDeserializer来将您的JSON字符串反序列化为一个存储对象,其字段项类型为Map< String,Item>
public class CustomDeserializer extends JsonDeserializer {
@Override
public Storage deserialize(JsonParser jsonParser,DeserializationContext deserializationContext)
throws IOException {
Map 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 items;
public Storage(Map map) {
this.items = map;
}
...
}
Option 2 – Create Map post deserialization
将JSON字符串反序列化为具有如开头所述的Item数组的Storage对象,然后构造您的Map< Integer,Item>后.
希望这可以帮助.