我有以下JSON代码段:
{ "randomlygeneratedKeyname0" : "some-value", "randomlygeneratedKeyname1": { "randomlygeneratedKeyname2" : { "randomlygeneratedKeyname3": "some-value", "randomlygeneratedKeyname4": "some-value" }, "randomlygeneratedKeyname5": { "randomlygeneratedKeyname6": "some-value", "randomlygeneratedKeyname7": "some-value" } } }
请注意,我不知道其名称,randomlygeneratedKeyname并且它们的命名约定 不一致, 因此无法创建相应的Java字段/变量名称。
randomlygeneratedKeyname
如何在GSON中反序列化它?
在此先感谢您的帮助。
代码转储解决方案:
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<Map<String, Object>>() {}.getType(); GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(mapStringObjectType, new RandomMapKeysAdapter()); Gson gson = gsonBuilder.create(); Map<String, Object> map = gson.fromJson(new FileReader("input.json"), mapStringObjectType); System.out.println(map); } } class RandomMapKeysAdapter implements JsonDeserializer<Map<String, Object>> { @Override public Map<String, Object> 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<String, Object> result = new HashMap<String, Object> (); JsonObject jsonObject = json.getAsJsonObject(); for (Entry<String, JsonElement> 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; } }