【问题标题】:JSON tag returns empty array [] while gson expects a stringJSON 标记返回空数组 [] 而 gson 需要一个字符串
【发布时间】:2013-06-21 03:50:33
【问题描述】:

我正在使用 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;

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

【问题讨论】:

    标签: android json parsing gson


    【解决方案1】:

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

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

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

    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(如果这是您真正想要的)。

    【讨论】:

    • 是的,该字段唯一一次是数组是当它为空时。我尝试检测“[]”字符和字符串并将其替换为“”...
    • 那么上面的就可以了。它将只是 null 而不是空的 String 无论如何恕我直言更好。
    【解决方案2】:

    在你的情况下:

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

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

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

    附加:

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

    1.OnlineJsonEditor.

    2.JsonGen

    【讨论】:

    • 是的。我试图这样做,但是当标签连续字符串时 .. 它给了我这个错误,应该是 BEGIIN ARRAY 但是是 String
    • 您可以将响应更改为始终为数组。
    • 如何做到这一点?我应该在课堂上这样做吗?任何示例代码都会有所帮助
    • 您的json代码有不一致的地方。请检查一下。你从哪里得到你的 json?
    • 嗯。所以你建议我应该确保我的 JSON 具有单一类型?
    【解决方案3】:

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

    private String[] internet_remarks;
    

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

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

    当它为空时,

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

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

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

    Gson gson = new Gson();
    

    【讨论】:

    • 是的,但我无法控制 JSON。无论如何我可以在将数据类型分配给我的属性之前更改我得到的数据类型吗?
    • 那是一个设计得很糟糕的json对象! :P 嗯,我仍在思考如何在不更改 json 的情况下使其工作
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多