2015-03-02 72 views
1

我有一些JSON,我想解析成POJO如何動態JSON屬性映射到一個固定的POJO場

{ 
    "groups": [ 
    { 
     "g1": [ 
     1,2,5,6,7 
     ] 
    }, 
    { 
     "g2": [ 
     2,3,48,79 
     ] 
    } 
    ] 
} 

當然,"g1""g1"是標識符,所以我會想象的那樣的POJO會像

class Container { 
    List<Group> groups; 
} 

class Group { 
    String id; 
    List<Integer> values; 
} 

......那麼它歸結爲這樣一個問題:如何使用傑克遜映射的JSON屬性的POJO?

+1

您可以使用像GSON或Jackson這樣的框架爲您做到這一點。 – jHilscher 2015-03-02 20:32:36

+1

是的,基本上,我只是寫了一個簡單的傑克森包裝爲此,但在「屬性名稱濫用作爲標識符」問題上弄得一塌糊塗 – helt 2015-03-02 20:35:08

+0

是那個有效的JSON? – 2015-03-02 20:51:01

回答

1

可以使用添加了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]]]]