'get Json values from a JsonArray inside a Json in Java using Map

i need to access the values of a Json, that its inside an Array, that its inside of a Json, the structure of the Json file its like this:

{
    "Places": [
    {
        "id": 17,
        "city": "Chicago",
        "vehicle": "car"
    },
    {
        "id": 13,
        "city": "New York",
        "vehicle": "plane",
    }
    ]
}

i only need the values of "id", "city" and "vehicle" im using the map function like this:

Gson gson = new Gson();
Map<String,String> userMap = gson.fromJson(contentoffile, Map.class);
        
        for (Object value : userMap.values()) {
            Map places= (Map) value;
            
            int id = (int) (places.get("id"));
            String city= (String) places.get("city");
            String vehicle= (String) places.get("vehicle");

but i got the next error

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map

how i can acces the data? btw, i can use other libraries for this, not only Map function



Solution 1:[1]

The structure you have is a JSON object that contains a JSON array places, I am not really sure what you are trying to achieve by using a Map<String, String>, you need to either create a Place POJO and parse accordingly OR just access it directly as a JsonObject:

Place.java

public class Place
{
    private int id;
    private String city;
    private String vehicle;

    public Place(int id, String city, String vehicle)
    {
        this.id = id;
        this.city = city;
        this.vehicle = vehicle;
    }

    // Setters & getters
}

    public static void main(String[] args)
    {
        Gson gson = new Gson();

        // Parse your file to a JsonObject
        JsonObject jsonObject = gson.fromJson(contentoffile, JsonObject.class);

        // Extract JsonArray (places) from JsonObject
        JsonArray jsonArray = jsonObject.get("Places").getAsJsonArray();

Option 1: Converting into List<Place>:

        // Convert JsonArray to a list of places  
        Type type = new TypeToken<List<Place>>() {}.getType();
        List<Place> places = gson.fromJson(jsonArray, type);

        //iterate over places
        for (Place place : places)
        {
           int id = place.getId();
           //etc..
        }
    }

Option 2: Iterating directly over JsonArray:

        for (JsonElement jsonElement : jsonArray)
        {
            //This will represent a Place object
            JsonObject curr = jsonElement.getAsJsonObject();

            int id = curr.get("id").getAsInt();
            String city = curr.get("city").getAsString();
            String vehicle  = curr.get("vehicle").getAsString();
        }

Option 3: Create a wrapper class

public class PlaceWrapper
{
   private List<Place> places;

   //Const, setters, getters
}
public static void main(String[] args)
    {
        Gson gson = new Gson();

        // Deserialize json 
        PlaceWrapper placeWrapper = gson.fromJson(contentoffile, PlaceWrapper.class);

        // iterate over places
        for (Place place : placeWrapper.getPlaces())
        {
            // do your thing
        }
   }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Bahij.Mik