2015-08-11 7 views
5

Googles cAdvisor API gibt JSON Ausgabe wie folgt:Wie kann ich Jackson verwenden, um JSON mit variablen Objektnamen zu analysieren?

{ 
    /system.slice/docker-13b18253fa70d837e9707a1c28e45a3573e82751f964b66d7c4cbc2256abc266.scope: {}, 
    /system.slice/docker-747f797d19931b4ef33cda0c519f935b592a0b828d16b8cafc350568ab2c1d28.scope: {}, 
    /system.slice/docker-bf947bfabf61cd5168bd599162cf5f5c2ea2350eece1ded018faebf598f7ee5b.scope: {}, 
    /system.slice/docker-e8e02d508400438603151dd462ef036d59fada8239f66be8e64813880b59a77d.scope: { 
    name: "/system.slice/docker-e8e02d508400438603151dd462ef036d59fada8239f66be8e64813880b59a77d.scope", 
    aliases: [...], 
    namespace: "docker", 
    spec: {...}, 
    stats: [...] 
    } 
} 

ich dies als 4 gleiche typisierte JSON-Objekte mit variablen/anonymen Namen beschreiben würde, in einem anonymen Objekt gehalten.

Mein erster Gedanke tun würde, nur so etwas wie mapper.readValue(response, Containers.class), wobei gilt:

public class Containers extends BaseJsonObject { 
    @JsonProperty 
    public List<Container> containerList; 
} 

und

public class Container extends BaseJsonObject { 
    @JsonProperty 
    private String name; 

    @JsonProperty 
    public String[] aliases; 

    @JsonProperty 
    private String namespace; 

    @JsonProperty 
    private String spec; 

    @JsonProperty 
    public Stats[] stats; 
} 

Aber alle Variationen zu diesem Thema I Ertrag das gleiche Ergebnis denken: eine Permutation von [email protected][containerList=<null>] oder com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "/system.slice/docker-13b18253fa70d837e9707a1c28e45a3573e82751f964b66d7c4cbc2256abc266.scope" (class com.xyz.Containers), not marked as ignorable (one known property: "containerList"]) at [Source: [email protected]; line: 1, column: 97] (through reference chain: com.xyz.Containers["/system.slice/docker-13b18253fa70d837e9707a1c28e45a3573e82751f964b66d7c4cbc2256abc266.scope"]), mit ACCEPT_SINGLE_VALUE_AS_ARRAY = false.

Ich habe versucht:

  • mapper.readValue(response, Container[].class)
  • mapper.readValue(response, Containers.class)
  • mapper.readValues(jsonParser, Container.class)

Neben den folgenden Konfigurationen:

  • mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  • mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

Wie kann ich analysieren JSON-Objekte mit variablen/anonymen Namen, in einem Nicht-Array gehalten? Wie heißt das?

+2

Ich glaube, Sie dieses JSON analysieren sollten Map glw

+0

finde ich die Dokumentation für "rohe" Datenbindung kurz nach dem Posten; das funktioniert. Ich würde immer noch gerne wissen, was ich hier falsch mache. – jordanpg

+0

Ich denke, es ist in diesem JSON Sie haben keine Liste/Array von Objekten. Sie haben Objekte mit Eigenschaften wie "/ system ...." und Werte sind Objekte. – glw

Antwort

2

Sie können the @JsonAnySetter annotation wie folgt verwenden und die Objekte mit Variablennamen in eine Karte von Map<String, Container> einfügen. Hier

ein Beispiel:

public class JacksonVariableNames { 

    static final String JSON = "{\n" 
      + " \"a\": {\n" 
      + " \"value\": \"1\"\n" 
      + " },\n" 
      + " \"b\": {\n" 
      + " \"value\": \"2\"\n" 
      + " },\n" 
      + " \"c\": {\n" 
      + " \"value\": \"3\"\n" 
      + " }\n" 
      + "}"; 
    static class Value { 
     private final String value; 

     @JsonCreator 
     Value(@JsonProperty("value") final String value) {this.value = value;} 

     @Override 
     public String toString() { 
      return "Value{" + 
        "value='" + value + '\'' + 
        '}'; 
     } 
    } 

    static class Values { 
     private final Map<String, Value> values = new HashMap<>(); 

     @JsonAnySetter 
     public void setValue(final String property, final Value value) { 
      values.put(property, value); 
     } 

     @Override 
     public String toString() { 
      return "Values{" + 
        "values=" + values + 
        '}'; 
     } 
    } 
    public static void main(String[] args) throws IOException { 
     final ObjectMapper mapper = new ObjectMapper(); 
     System.out.println(mapper.readValue(JSON, Values.class)); 

    } 
} 

Ausgang:

Values{values={a=Value{value='1'}, b=Value{value='2'}, c=Value{value='3'}}} 
Verwandte Themen