JSON标记返回空数组[],而gson需要一个字符串

时间:2013-06-21 03:50:34

标签: android json parsing gson

我正在使用GSON Library来解析我的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;

我的问题是我应该做出哪些更改,以便变量适应空数组[]

3 个答案:

答案 0 :(得分:3)

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

请参阅:How do I write a custom deserializer?此处有关SO和/或Gson User's guide

中的信息

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

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):
    }
}

如果实际情况并非如此,并且该数组可能不为空,那么您需要添加逻辑来处理它并将其转换为String,如果这是您真正想要的。

答案 1 :(得分:0)

在你的情况下:

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

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

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

附加功能:

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

1。OnlineJsonEditor.

2。JsonGen

答案 2 :(得分:0)

我建议将第二个属性声明为数组。即

private String[] internet_remarks;

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

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

当它为空时,

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

因此,json始终保持一致。

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

Gson gson = new Gson();