Java: Parsing JSON with unknown keys to Map

SRobertJames :

In Java, I need to consume JSON (example below), with a series of arbitrary keys, and produce Map<String, String>. I'd like to use a standard, long term supported JSON library for the parsing. My research, however, shows that these libraries are setup for deserialization to Java classes, where you know the fields in advance. I need just to build Maps.

It's actually one step more complicated than that, because the arbitrary keys aren't the top level of JSON; they only occur as a sub-object for prefs. The rest is known and can fit in a pre-defined class.

{
    "al" : { "type": "admin", "prefs" : { "arbitrary_key_a":"arbitary_value_a", "arbitrary_key_b":"arbitary_value_b"}},
    "bert" : {"type": "user", "prefs" : { "arbitrary_key_x":"arbitary_value_x", "arbitrary_key_y":"arbitary_value_y"}},
    ...
}

In Java, I want to be able to take that String, and do something like:

people.get("al").get("prefs"); // Returns Map<String, String>

How can I do this? I'd like to use a standard well-supported parser, avoid exceptions, and keep things simple.


UPDATE

@kumensa has pointed out that this is harder than it looks. Being able to do:

people.get("al").getPrefs(); // Returns Map<String, String>
people.get("al").getType();  // Returns String

is just as good.

That should parse the JSON to something like:

public class Person {
    public String type;
    public HashMap<String, String> prefs;
}
// JSON parsed to:
HashMap<String, Person>
Abrikot :

Having your Person class and using Gson, you can simply do:

final Map<String, Person> result = new Gson().fromJson(json, new TypeToken<Map<String, Person>>() {}.getType());

Then, retrieving prefs is achieved with people.get("al").getPrefs();.

But be careful: your json string is not valid. It shouldn't start with "people:".

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=157443&siteId=1