我正在使用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;
我的问题是我应该做出哪些更改,以便变量适应空数组[]
答案 0 :(得分:3)
如果你不控制(设计不佳的)JSON的源代码并且无法修复它,那么你将需要编写一个构造你的MainContainer
对象的自定义反序列化器。
请参阅:How do I write a custom deserializer?此处有关SO和/或Gson User's guide
中的信息如果该字段是数组类型的唯一时间是它是一个空数组,我能想到的最简单的方法就是检查返回的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):
}
}
如果实际情况并非如此,并且该数组可能不为空,那么您需要添加逻辑来处理它并将其转换为String
,如果这是您真正想要的。
答案 1 :(得分:0)
在你的情况下:
当您要求将数组解析为字符串时,gson解析器会感到困惑。
因此,您可以将internet_remarks更改为字符串数组。
在容器类中使用annonations始终是一种安全的方法。
附加功能:
当你使用json时,这两个工具会很方便。
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();