2015-11-17 81 views
0

我正在努力将具有变量内容的JSON对象解析为Java对象。Gson/Retrofit解析变量JSON

通常,我会尝试将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对象转换器不工作,因为这不能被映射到一个简单的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] 

我想我要创建一个自定义解串器这一点,但我不知道从哪里开始。

任何帮助指出我在良好的方向将不胜感激。

编辑:正如在评论中指出的,是提供的JSON数据不是有效的键值对形成。我已经联系了API提供商,他们会解决这个问题。

直到我遇到前端处理这个问题的一种方法,我会保持这个问题的公开。

+0

它不是键值对,你可能想重新考虑json数据 –

+0

你可以用gson将它转换为LinkedHashMap/ArrayLists吗? – Bill

回答

0

所以之后的AF几天后再次在这个问题看后,我终于发现,我的情况下有效的解决方案!

而不是试图将元素解析为String,正如我第一次尝试。现在我的数据存储到一个简单的java.lang.Object

我的模型现在看起来是这样的:

@SerializedName("parts") 
@Expose 
private List<List<Object>> parts = new ArrayList<List<Object>>(); 

这可以防止GSON解析过程,从检测到无效的数组时崩溃的应用程序。

当试图访问数据时,我现在检查对象是否为String类型,如果这种情况我继续,忽略所有数组。

在我的代码,这看起来是这样的: (在我的情况,我只需要第一个元素的文本属性的部分阵列中)

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(); 
      } 
     } 
    } 
0

第二个数组元素中的第二个元素也是您发布的JSON中的数组。

由于GSON正在期待字符串列表的列表,因此无法解析此时开始的文档。

"parts": [ 
     ..., 
     [ 
     "page", 
     [ <--- Problematic array begin 
      "http://www.example.com/", 
      "\n\t\n\t\t\n\t\t\tSome of the Page Content preview here...", 
      "", 
      "/path/to/picture.jpg" 
     ] 
     ], 
     ... 
    ] 
+0

我意识到这是一个问题,但我正在寻找一种解决方法来检索信息。对此有何建议? – RWIL

+0

您是否拥有JSON文档?本文档不能很好地使用JSON中可用的结构。 – rmlan

+0

不幸的是,这是我必须使用的API提供的。 – RWIL

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来识别它们。映射它会很麻烦,因为在"page"字符串之后的JSON Array

如果我的建议JSON可以被映射到一个List<List<String>> POJO,你必须得到第二个元素并手动解析它,因为第二个数组里面仍然有一个数组。

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

问候,

里德