我的探针示例:
我们有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模型对象,以使该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指南。
问题内容: 我的探针示例: 我们有Apple的对象类型。苹果有一些成员变量: 种子对象如下所示。 现在,当我得到一个苹果物体时,一个苹果可能有多个种子,或者可能有一个种子,或者可能没有种子! 带有一个种子的示例JSON苹果: 带有两个种子的示例JSON苹果: 现在的问题是,第一个示例是用于种子的JSONObject,第二个示例是用于种子的JSONArray。现在,我知道它的JSON不一致,并且最简
问题内容: 下面的示例显示了一个类(Club),其中包含抽象类(成员)的集合。我对于是否需要TypeAdapter或JsonDeserializer才能使反序列化正常工作感到困惑。序列化在没有任何帮助的情况下就可以正常工作,但是反序列化会引发异常。为了说明这一点,我构建了以下“克隆”测试。如果有人能展示一个有效的例子,我将不胜感激。 头等舱 现在是抽象基类成员 以及成员的两个具体子类(金和银)
问题内容: 确定,所以我编辑了问题,因为它不够清楚。 编辑2 :更新了JSON文件。 我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。 例如,如果在JSON中,我有以下内容: 我不想保留我当前的对象结构,即一个对象,其中包含一个和一个“总计”。但是我只想将
问题内容: gson是一个很棒的图书馆-运作良好。有时我有自定义要求,并且可以制作和注册TypeAdapters和TypeAdaptorFactories-效果也很好。 但是令我困惑的是如何委托回json序列化…大多数时候,我需要使用它进行收集,但为了说明这一点- 假设我有一个配对类,gson显然会很高兴地序列化,但是出于某种原因我需要自己的自定义序列化程序。好吧…如果我是 如果我为此编写了一个类
然而,让我困惑的是,如何将委托返回到json序列化中...大多数时候,我需要这个集合,但为了说明这一点-假设我有一个pair类,gson显然会很高兴地序列化它,但出于某种原因,我需要自己的自定义序列化器。嗯...如果我的双是 如果我为此编写了一个类型适配器-您将希望write函数看起来如下所示: 所以你可以看到问题--我不知道第一个和第二个的类型,也不知道它们是如何序列化的。我可以使用gson.t