我的探针示例:
我们有Apple的对象类型。苹果有一些成员变量:
String appleName; // The apples name String appleBrand; // The apples brand List<Seed> seeds; // A list of seeds the apple has
种子对象如下所示。
String seedName; // The seeds name long seedSize; // The size of the seed
现在,当我得到一个苹果物体时,一个苹果可能有多个种子,或者可能有一个种子,或者可能没有种子!
带有一个种子的示例JSON苹果:
{ "apple" : { "apple_name" : "Jimmy", "apple_brand" : "Awesome Brand" , "seeds" : {"seed_name":"Loopy" , "seed_size":"14" } } }
带有两个种子的示例JSON苹果:
{ "apple" : { "apple_name" : "Jimmy" , "apple_brand" : "Awesome Brand" , "seeds" : [ { "seed_name" : "Loopy", "seed_size" : "14" }, { "seed_name" : "Quake", "seed_size" : "26" } ]} }
现在的问题是,第一个示例是用于种子的JSONObject,第二个示例是用于种子的JSONArray。现在,我知道它的JSON不一致,并且最简单的解决方法是修复JSON本身,但是不幸的是,我从其他人那里获得了JSON,所以我无法修复它。解决此问题的最简单方法是什么?
您需要为该Apple类型注册一个自定义类型适配器。在类型适配器中,您将添加逻辑以确定是否为您提供了数组或单个对象。使用该信息,您可以创建Apple对象。
Apple
除以下代码外,请修改您的Apple模型对象,以使该seeds字段不会自动解析。将变量声明更改为类似以下内容:
seeds
private List<Seed> seeds_funkyName;
这是代码:
GsonBuilder b = new GsonBuilder(); b.registerTypeAdapter(Apple.class, new JsonDeserializer<Apple>() { @Override public Apple deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { JsonObject appleObj = arg0.getAsJsonObject(); Gson g = new Gson(); // Construct an apple (this shouldn't try to parse the seeds stuff Apple a = g.fromJson(arg0, Apple.class); List<Seed> seeds = null; // Check to see if we were given a list or a single seed if (appleObj.get("seeds").isJsonArray()) { // if it's a list, just parse that from the JSON seeds = g.fromJson(appleObj.get("seeds"), new TypeToken<List<Seed>>() { }.getType()); } else { // otherwise, parse the single seed, // and add it to the list Seed single = g.fromJson(appleObj.get("seeds"), Seed.class); seeds = new ArrayList<Seed>(); seeds.add(single); } // set the correct seed list a.setSeeds(seeds); return a; } });
有关更多信息,请参阅Gson指南。