Gson / Retrofit解析变量JSON

时间:2015-11-17 19:17:17

标签: java json gson retrofit

我正在努力将具有可变内容的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提供商,他们会对此进行排序。

直到我遇到在前端处理这个问题的方法,我才会打开这个问题。

3 个答案:

答案 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,你必须得到第二个元素并再次手动解析它,因为第二个数组里面还有一个数组。

希望这有帮助,祝你好运!!!

此致

里德