I\'m having trouble reading a JSON file into a POJO. Let me give you a snippet of what my JSON file entails:
{
\"Speidy\": {
\"factionId\": \"2\",
If you do have control the format of the JSON, I suggest the overall list structure that jmort253 suggests in his answer, i.e. [{"name":"Speidy", ... },{"name":"ShadowSlayer272", ... }]
.
If you have no control over the generated JSON, here's two ways to map a JSON snippet like the one in your question {"Speidy":{ ... },"ShadowSlayer272":{ ... }}
with Gson:
Without your Container
class and a little bit of TypeToken
voodoo:
// Ask Gson to deserialize the JSON snippet into a Map.
Type type = new TypeToken
With your Container
class and a custom JsonDeserializer
:
class ContainerDeserializer implements JsonDeserializer {
public Container deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
List nodes = new ArrayList();
JsonObject players = json.getAsJsonObject();
for (Entry player : players.entrySet()) {
String playerName = player.getKey();
JsonElement playerData = player.getValue();
// Use Gson to deserialize all fields except
// for the name into a Node instance ...
Node node = context.deserialize(playerData, Node.class);
node.name = playerName; // ... then set the name.
nodes.add(node);
}
return new Container(nodes);
}
}
This assumes a constructor like Container(List
and allows Container
instances to be immutable which is usually a Good Thing.
Register and use the custom serializer like this:
GsonBuilder builder = new GsonBuilder();
// Tell Gson to use the custom ContainerDeserializer whenever
// it's asked for a Container instance.
builder.registerTypeAdapter(Container.class, new ContainerDeserializer());
Gson gson = builder.create();
// Ask Gson to create Container instance from your JSON snippet.
Container container = gson.fromJson(json, Container.class);