Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing a complex Json Object using GSON in Java

I have a very long JSON to parse with Gson, but for brevity I have trimmed it to this example:

{  "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     }  ] } 

From SO and few other places, I have found that I need to define a top level container like one below but I do not know how to complete its definition

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

and then a class for each 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;  } 

I am trying to parse it and this is what I coded so far:

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

The JSON string is stored in a variable named response

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

My final requirement is a HashTable of id and associated name.

like image 437
The_Lost_Avatar Avatar asked Oct 23 '13 20:10

The_Lost_Avatar


People also ask

How do you parse a JSON object in Java?

First, we need to convert the JSON string into a JSON Object, using JSONObject class. Also, note that “pageInfo” is a JSON Object, so we use the getJSONObject method. Likewise, “posts” is a JSON Array, so we need to use the getJSONArray method.

What is the difference between JSON and Gson?

GSON can use the Object definition to directly create an object of the desired type. While JSONObject needs to be parsed manually.


1 Answers

First problem: your VolumeContainer needs to be:

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

it does not need to be static.

Second problem: your Volume class should be like this:

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;} } 

I defined a class named Support like this:

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

Third problem: parsing, If response string contains your example data, simply parse like this:

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

Fourth problem: get the map. Finally to get your HashMap, just do like this:

HashMap<String, String> hm = new HashMap<String,String>(); for(Volume v: vc.volumes){   hm.put(v.getId(), v.getName());   } 
like image 176
giampaolo Avatar answered Sep 17 '22 17:09

giampaolo