我正在努力将具有可变内容的JSON对象解析为Java对象。
通常情况下,我会尝试将JSON对象映射到POJO,但在这种情况下我不知道该怎么做。
我的JSON看起来像这样:
"parts": [
[
"text",
"http://www.example.com/"
],
[
"page",
[
"http://www.example.com/",
"\n\t\n\t\t\n\t\t\tSome of the Page Content preview here...",
"",
"/path/to/picture.jpg"
]
],
[
"text",
"Another String here "
]
]
通过典型的Json到Java Object转换器运行这段代码不起作用,因为这不能映射到简单的POJO。
我尝试转换为List<List<String>>> myObject;
,但正如预期的那样,这给了我一个例外:
W: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 9563 path $[3]./object.parts[1][1]
我想我必须为此创建一个自定义DeSerializer,但我不知道从哪里开始。
非常感谢任何帮助我指向良好方向的帮助。
编辑:正如评论中所指出的那样,提供的JSON数据不是有效的键值对形成。我已经联系了API提供商,他们会对此进行排序。
直到我遇到在前端处理这个问题的方法,我才会打开这个问题。
答案 0 :(得分:1)
所以在几天之后再次看到这个问题之后,我终于找到了适用于我的案例的解决方案!
而不是像我第一次尝试那样将元素解析为String
。我现在将数据存储到简单的java.lang.Object
我的模型现在看起来像这样:
@SerializedName("parts")
@Expose
private List<List<Object>> parts = new ArrayList<List<Object>>();
这可以防止GSON解析过程在检测到无效数组时崩溃应用程序。
当我尝试访问数据时,我现在检查对象是否为String
类型,如果是这种情况我继续,忽略所有数组。
在我的代码中,这看起来像这样: (在我的例子中,我只需要parts数组中第一个元素的text属性)
List<List<Object>> partList = myParsedObject.getParts();
if (partList.size() > 0) {
if (partList.get(0).size() > 1) {
if (partList.get(0).get(1) instanceof String) {
return partList.get(0).get(1).toString();
}
}
}
答案 1 :(得分:0)
第二个数组元素中的第二个元素也是您发布的JSON中的数组。
由于GSON期待一个字符串列表列表,因此无法从此处开始解析文档。
janrain.events.onProviderLoginComplete.addHandler(function (response) {
janrain.engage.signin.modal.close();
});
答案 2 :(得分:0)
您的JSON格式不正确,我尝试将您发布的JSON检查到Online JSON Formatter,但无法解析您的JSON。您需要将JSON封装在花括号中,如下所示:
{"parts": [
[
"text",
"http://www.example.com/"
],
[
"page",
[
"http://www.example.com/",
"\n\t\n\t\t\n\t\t\tSome of the Page Content preview here...",
"",
"/path/to/picture.jpg"
]
],
[
"text",
"Another String here "
]
]
}
联机JSON格式化程序将成功解析JSON,您应该可以解析它。问题是你必须处理许多JSON Array
,而这些key
没有JSON Array
来识别它们。由于"page"
字符串之后的List<List<String>>
,映射它会很麻烦。
如果我建议的JSON可以映射到library(rasterVis)
s <- stack(replicate(6, raster(matrix(runif(100), 10))))
levelplot(s, layout=c(3, 2), index.cond=list(c(1, 3, 5, 2, 4, 6)))
POJO,你必须得到第二个元素并再次手动解析它,因为第二个数组里面还有一个数组。
希望这有帮助,祝你好运!!!
此致
里德