Umgang mit zufällig generierten und inkonsistenten JSON-Feld- / Schlüsselnamen mit GSON

Ich habe die folgenden JSON-Snippets:

{ "randomlygeneratedKeyname0" : "some-value", "randomlygeneratedKeyname1": { "randomlygeneratedKeyname2" : { "randomlygeneratedKeyname3": "some-value", "randomlygeneratedKeyname4": "some-value" }, "randomlygeneratedKeyname5": { "randomlygeneratedKeyname6": "some-value", "randomlygeneratedKeyname7": "some-value" } } } 

Hinweise, dass ich den Namen von randomlygeneratedKeyname generatedKeyname nicht kenne und ihre Namenskonvention inkonsistent ist, konnte ich meine entsprechenden Java-Feld / Variablennamen nicht erstellen.

Wie kann ich es in GSON serialisieren?

Vielen Dank im Voraus für Ihre Hilfe.

Code-Dump-Lösung:

 import java.io.FileReader; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; public class Foo { public static void main(String[] args) throws Exception { Type mapStringObjectType = new TypeToken>() {}.getType(); GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(mapStringObjectType, new RandomMapKeysAdapter()); Gson gson = gsonBuilder.create(); Map map = gson.fromJson(new FileReader("input.json"), mapStringObjectType); System.out.println(map); } } class RandomMapKeysAdapter implements JsonDeserializer> { @Override public Map deserialize(JsonElement json, Type unused, JsonDeserializationContext context) throws JsonParseException { // if not handling primitives, nulls and arrays, then just if (!json.isJsonObject()) throw new JsonParseException("some meaningful message"); Map result = new HashMap (); JsonObject jsonObject = json.getAsJsonObject(); for (Entry entry : jsonObject.entrySet()) { String key = entry.getKey(); JsonElement element = entry.getValue(); if (element.isJsonPrimitive()) { result.put(key, element.getAsString()); } else if (element.isJsonObject()) { result.put(key, context.deserialize(element, unused)); } // if not handling nulls and arrays else { throw new JsonParseException("some meaningful message"); } } return result; } } 

Ich freue mich, berichten, dass mit GSON 2.0 Standard-Karten und -Listen ohne Aufwand unterstützt. Deserialize wie folgt:

 Object o = new Gson().fromJson(json, Object.class); 

Das Ergebnis ist eine Map mit String Schlüsseln und entweder String oder Map Werten.

Serialisieren Sie die Karte wie folgt in JSON:

 String json = new Gson().toJson(o); 

Wir hoffen, GSON 2.0 im Oktober 2012 veröffentlichen zu können. Sie können es früh von GSON SVN bekommen .