Java: Get value from a Json string (Set<String>)

Viewed 762

I'm using this method that returns a Set<String> but in fact what I got is a Json string like this

[
  {
   "id":"Id1"
  },
  {
  "id":"Id2",
  "title":"anyTitle"
  }
]

My goal is to get the value of key "id". I've also made a java bean to map the data:

public class Data {
    private String id;
    private String title;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

I tryied to parse using gson but all I can get is an error: Cannot cast 'java.util.LinkedHashMap$LinkedKeyIterator' to 'com.google.gson.stream.JsonReader'

So, obviously I'm doing something wrong:

Set<String> availableData = getData(); //this method returns a json string
Iterator<String> itr = availableData.iterator();
        while (itr.hasNext()) {
            Gson gson = new Gson();
            JsonParser parser = new JsonParser();
            JsonObject object = (JsonObject) parser.parse(itr.next());
            Data data = gson.fromJson(object, Data.class);
        }

update: The actual error is: Type mismatch Can't assign com.google.common.collect.Maps$TransformedEntriesMap to java.lang.String

4 Answers

In that line you pass an iterator:

JsonObject object = (JsonObject) parser.parse((JsonReader) itr);

But you should pass a next element:

JsonObject object = (JsonObject) parser.parse(itr.next());

In addition you got an extra comma in you JSON.


You can replace the whole block with that line:

Data data = gson.fromJson(itr.next(),Data.class)

Use Jackson mapper. You can directly convert it into an object and retrieve through getters.

 ObjectMapper objectMapper = new ObjectMapper();

String carJson =
    "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

try {
    Car car = objectMapper.readValue(carJson, Car.class);

    System.out.println("car brand = " + car.getBrand());
    System.out.println("car doors = " + car.getDoors());
} catch (IOException e) {
    e.printStackTrace();
}

So, following this related issue: https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/5154, finally I map this using JSONArray and streams from java8

Set<String> availableData = getData();
        JSONArray dataArray = new JSONArray(availableData);
        List<Object> dataList = dataArray.toList();
        Object o = dataList.stream()
                .filter(c -> ((Map) c).get("id").toString().contains("Id1"))
                .findFirst().orElse(null);
        return ((Map)o).get("id").toString();

Maybe you want to known how to use Gson to unserialized json to java object.

Here are two ways I can give you.

    public void parse() {
        String jsonString = "[\n" +
            "  {\n" +
            "   \"id\":\"Id1\"\n" +
            "  },\n" +
            "  {\n" +
            "  \"id\":\"Id2\",\n" +
            "  \"title\":\"anyTitle\"\n" +
            "  }\n" +
            "]";

        Gson gson = new Gson();

        // Use Gson Type
        Type setType = new TypeToken<HashSet<Data>>(){}.getType();
        Set<Data> dataSet = gson.fromJson(jsonString, setType);

        // Print [Data{id='Id2', title='anyTitle'}, Data{id='Id1', title='null'}]
        System.out.println(dataSet);

        // Use Java Array
        Data[] dataArray = gson.fromJson(jsonString, Data[].class);

        // Print [Data{id='Id1', title='null'}, Data{id='Id2', title='anyTitle'}]
        System.out.println(Arrays.toString(dataArray));

    }
Related