0

我正在使用 GSON 库来解析我的 JSON 标记。

一些标签应该保存字符串值(不是数组)。问题是,有时元素是空的[],当它这样做时,控制台会给我这个错误

expected String but was BEGIIN ARRAY.

以下是我的 JSON 的理想情况

   {
     "internet": "600.00",
    "internet_remarks": "Fibre 1gbps",
    }

但有时它会变成

        {
        "internet": "600.00",
        "internet_remarks": [],
        }

我的解析代码如下:

GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
MainContainer mainContainer = gson.fromJson(obj, MainContainer.class);    

而在我的班级中,varailbas的定义如下

private String internet;
private String internet_remarks;

我的问题是我应该进行哪些更改以使变量适应空数组 []

4

3 回答 3

4

如果您不控制(设计不佳的)JSON 的来源并且无法修复它,那么您将需要编写一个自定义的反序列化器来构造您的MainContainer对象。

请参阅:如何编写自定义反序列化器?这里是 SO 和/或Gson 用户指南中的信息

如果该字段唯一一次是数组类型是当它是一个空数组时,我能想到的最简单的方法是简单地检查返回的 JSON,如果它是一个数组,则将其删除。然后反序列化到你的MainContainer. Gson 默默地忽略 JSON 中的任何缺失元素,internet_remarks并将null在您的MainContainer.

class MyDeserialier implements JsonDeserializer<MainContainer>
{
    @Override
    public MainContainer deserialize(JsonElement je, Type type, 
                                     JsonDeserializationContext jdc) 
                                      throws JsonParseException
    {
        JsonObject obj = je.getAsJsonObject();
        if (obj.get("internet_remarks").isJsonArray())
        {
            obj.remove("internet_remarks");
        }

        return new Gson().fromJson(obj, MainContainer.class):
    }
}

如果实际情况并非如此,并且该数组可能不是空的,则您需要添加处理该问题的逻辑并将其转换为 a Stringif 那是您真正想要的。

于 2013-06-22T18:02:58.853 回答
0

在你的情况下:

当您要求 gson 解析器将数组解析为字符串时,它会感到困惑。

因此,您可以将 internet_remarks 更改为字符串数组。

在容器类中使用注解始终是一种安全的方法。

附加功能:

当您使用 json 时,这两个工具会很方便。

1. OnlineJsonEditor。

2.JsonGen _

于 2013-06-21T04:22:53.387 回答
0

我建议将您的第二个属性声明为数组。IE

private String[] internet_remarks;

当你有一个字符串时,仍然把它放在数组中。例如:

{
     "internet": "600.00",
     "internet_remarks": ["Fibre 1gbps"]
    }

空的时候,

 {
     "internet": "600.00",
     "internet_remarks": []
    }

因此,您json将始终保持一致。

另外,我注意到您并没有真正使用GsonBuilder. 您可以只Gson使用构造函数而不是构建器来创建实例。

Gson gson = new Gson();
于 2013-06-21T04:55:15.347 回答