2013-10-23 6 views
23

Parsing habe ich eine sehr lange JSON mit Gson zu analysieren, aber der Kürze halber habe ich es zu diesem Beispiel getrimmt:ein komplexes JSON-Objekt mit Gson in Java

{ 
"volumes": [ 
    { 
    "status": "available", 
    "managed": true, 
    "name": "va_85621143-1133-412f-83b4-57a01a552638_", 
    "support": { 
    "status": "supported" 
    }, 
    "storage_pool": "pfm9253_pfm9254_new", 
    "id": "afb8e294-6188-4907-9f6f-963c7623cecb", 
    "size": 9 
    }, 
    { 
    "status": "in-use", 
    "managed": false, 
    "name": "bt_newd20", 
    "support": { 
    "status": "not_supported", 
    "reasons": [ 
    "This volume is not a candidate for management because it is already attached to a virtual machine. To manage this volume with PowerVC, select the virtual machine to which the volume is attached for management. The attached volume will be automatically included for management." 
    ] 
    }, 
    "storage_pool": "KVM", 
    "mapped_wwpns": [ 
    "2101001B32BD4280", 
    "2100001B329D4280", 
    "2101001B32BD637E", 
    "2100001B329D637E" 
    ], 
    "id": "c7838c79-17ca-3cbc-98e5-3567fde902d8", 
    "size": 0 
    }, 
    { 
    "status": "available", 
    "managed": true, 
    "name": "vdisk138", 
    "support": { 
    "status": "supported" 
    }, 
    "storage_pool": "Chassis2_IBMi", 
    "id": "b6d00783-9f8c-40b8-ad78-956b0299478c", 
    "size": 100 


    } 
] 
} 

Von SO und einigen anderen Orten, ich habe festgestellt, dass ich einen Top-Level-Container wie ein unten, aber ich weiß nicht, wie seine Definition abzuschließen

static class VolumeContainer {   
//I don't know what do in here. This is the first problem 
} 

und dann eine Klasse für jeden Volume

static class Volume { 
    private String status; 
    private boolean managed; 
    private String name; 

    //This is the second problem.The "support" variable should not be a string. 
    //It is in {}. Just for information, I won't use it. 
    //private String support; 

    private String storagePool; 
    private List<String> mapped_wwpns; 
    private String id; 
    private String size; 

} 
definieren muß

Ich versuche, es zu analysieren, und das ist, was ich bisher codiert:

JsonParser parser = new JsonParser(); 
JsonObject obj = parser.parse(response).getAsJsonObject(); 

Gson gson = new Gson(); 

Die JSON-String in einer Variablen Antwort

VolumeContainer vc = gson.fromJson(response,VolumeContainer.class); 

Meine letzte Forderung ein HashTable von id Namen gespeichert ist, und assoziierte name.

Antwort

43

Erstes Problem: Ihre VolumeContainer Bedürfnisse sein:

public class VolumeContainer { 
    public List<Volume> volumes; 
} 

es muss nicht statisch sein.

Zweites Problem: Ihre Volume Klasse wie folgt sein sollte:

public class Volume { 
    private String status; 
    private Boolean managed; 
    private String name; 
    private Support support; 
    private String storage_pool; 
    private String id; 
    private int size; 
    private List<String> mapped_wwpns; 

    public String getId(){return id;} 
    public String getName(){return name;} 
} 

definiert ich eine Klasse Support wie folgt benannt:

public class Support { 
    private String status; 
    private List<String> reasons; 
} 

Drittes Problem: Parsen Wenn response Zeichenfolge enthält Ihre Beispieldaten, einfach parsen wie folgt:

Gson g = new Gson(); 
VolumeContainer vc = g.fromJson(response, VolumeContainer.class); 

Viertes Problem: Holen Sie sich die Karte. Schließlich, um Ihre HashMap zu bekommen, tun Sie einfach so:

+0

Vielen Dank, das funktioniert wie ein Charme. Im Gson-Beispiel haben sie vorausgesetzt, sie haben die Klasse statisch gemacht, können Sie bitte erklären, warum sie es getan haben und warum ich nicht sollte ?? http://code.google.com/p/google-gson/source/browse/trunk/extras/src/main/java/com/google/gson/extras/examples/rawcollections/RawCollectionsExample.java –

+0

Sie ' Du bist willkommen. Sie machten eine statische Klasse, da es eine innere Klasse war (sie behielten Beispiel kompakt und da Gson nicht gut mit nicht statischen inneren Klassen ist). Wenn Sie Ihre Klassen in separaten Quelldateien deklarieren, benötigen Sie überhaupt keine statische Methode. Siehe dies: http://StackOverflow.com/Questions/19449761/Gson-does-Not-Deserialize-Reference-Touter-Class/19459605#19459605 – giampaolo

+0

Sollten 'Volumes' nicht öffentlich sein? Sehen, wie Sie darauf zugreifen, als wäre es hier 'vc.volumes' (im vierten Problem). Oder fehlt mir etwas? – jackdh

Verwandte Themen