可以使用添加了JsonDeserialize註釋的自定義解串器來解析這種結構。
的POJO
public static class Container {
private List<Group> groups;
public List<Group> getGroups() {
return groups;
}
public void setGroups(List<Group> groups) {
this.groups = groups;
}
@Override
public String toString() {
return String.format("Container [groups=%s]", groups);
}
}
@JsonDeserialize(using=CustomDeserializer.class)
public static class Group {
String id;
List<Integer> values;
@Override
public String toString() {
return String.format("Group [id=%s, values=%s]", id, values);
}
}
解串器,注意使用ObjectMapper.readTree而不是使用低級別JsonParser API ...
public static class CustomDeserializer extends JsonDeserializer<Group> {
@Override
public Group deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
Group group = new Group();
ObjectNode objectNode = new ObjectMapper().readTree(jp);
// assume only a single field...
Entry<String, JsonNode> field = objectNode.fields().next();
group.id = field.getKey();
// there might be a nicer way to do this...
group.values = new ArrayList<Integer>();
for (JsonNode node : ((ArrayNode)field.getValue())) {
group.values.add(node.asInt());
}
return group;
}
}
測試
public static void main(String[] args) throws Exception {
String json = "{\"groups\": [{\"g1\":[1,2,5,6,7]},{\"g2\": [2,3,48,79]}]}";
JsonFactory f = new JsonFactory();
JsonParser jp = f.createParser(json);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(jp, Container.class));
}
輸出
Container [groups=[Group [id=g1, values=[1, 2, 5, 6, 7]], Group [id=g2, values=[2, 3, 48, 79]]]]
您可以使用像GSON或Jackson這樣的框架爲您做到這一點。 – jHilscher 2015-03-02 20:32:36
是的,基本上,我只是寫了一個簡單的傑克森包裝爲此,但在「屬性名稱濫用作爲標識符」問題上弄得一塌糊塗 – helt 2015-03-02 20:35:08
是那個有效的JSON? – 2015-03-02 20:51:01