我试图在android中的一个sqlite数据库中获得一个fusiontables sql响应。 jsonlint.com说该对象是有效的JSON。但是,“行”中的数组不会被识别为JsonArrays或JSONArrays。 sql响应中的行数可以变化。下面是一个示例响应。我很感激任何帮助,指出我正确的解决方向。甚至帮我提出一个更好的问题。我很难过!
{
"columns":"[Text, Number, Location, Date, ma, mb, mc, md, me, mf, mg, mh, mi, Xtid, JTid]",
"kind":"fusiontables#sqlresponse",
"rows":"[
[Text, 1.0, 33.2, -81.2, 2013-04-29T20:34:31.518-04:00, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 100.0],
[Text, 3.0, 33.2, -81.2, 2013-04-29T20:43:43.257-04:00, 24.0, 23.0, 18.0, 19.0, 54.0, 21.0, 31.0, 45.0, 32.0, 29.7, 58.1],
[Text, 5.0, 33.2, -81.2, 2013-05-01T06:58:09.801-04:00, 51.0, 51.0, 51.0, 51.0, 51.0, 51.0, 51.0, 51.0, 51.0, 51.0, 100.0],
[Text, 3.0, 33.2, -81.2, 2013-05-02T05:32:04.970-04:00, 52.0, 52.0, 52.0, 52.0, 52.0, 52.0, 52.0, 52.0, 52.0, 52.0, 100.0]
]"
}
//************ code
String json = SyncResponse.toString();
JsonObject root = parser.parse(json).getAsJsonObject();
System.out.println("root" + root); //this is where I got the JSON output listed above
答案 0 :(得分:2)
rows
中的值无法识别为数组,因为它不是数组!
在方括号前后有双引号:"[...]"
,也就是说,你只有一个字符串......这个字符串包含JSON数组的表示,但它不能被视为一个数组...
在您的情况下,正确的JSON响应应该类似于以下内容。请注意,作为字符串的所有值都是用双引号写的,但数组(和数字)不是用双引号括起来的......
{
"columns": [ "Text", "Number", "Location", "Date", "ma", "mb", "mc", "md", "me", "mf", "mg", "mh", "mi", "Xtid", "JTid" ],
"kind": "fusiontables#sqlresponse",
"rows": [
[ "Text", 1, 33.2, -81.2, "2013-04-29T20:34:31.518-04:00", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 100],
[ "Text", 3, 33.2, -81.2, "2013-04-29T20:43:43.257-04:00", 24, 23, 18, 19, 54, 21, 31, 45, 32, 29.7, 58.1 ],
[ "Text", 5, 33.2, -81.2, "2013-05-01T06:58:09.801-04:00", 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 100],
[ "Text", 3, 33.2, -81.2, "2013-05-02T05:32:04.970-04:00", 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 100]
]
}
编辑:首先,请注意,正如我之前所说,你的JSON响应无效......好吧,更好的说,它是有效的,但它不能正确表示JSON元素,但它将它们表示为字符串..
那就是说,我提出了以下解决方法:
首先,您需要一个类来包装您的JSON响应,例如:
public class Response {
public String columns;
public String kind;
public String rows;
}
然后你必须解析你的回复(假设你在字符串jsonString
中有你的JSON响应):
Gson gson = new Gson();
Response response = gson.fromJson(jsonString, Response.class);
现在您有一个类Response
,其中3个属性代表JSON响应中的3个字符串(columns
,kind
和rows
)。
现在你必须重新解析这些字符串,如下所示:
Type listOfStringsType = new TypeToken<List<String>>() {}.getType();
List<String> columns = gson.fromJson(response.columns, listOfStringsType);
有了这个,您的List<String> columns
包含所有值:"Text", "Number", "Location", "Date", "ma", ...
最后你必须做一些类似于列的事情,但在这种情况下,它不是列表,而是列表列表:
Type listOfListsOfStringsType = new TypeToken<List<List<String>>>() {}.getType();
List<List<String>> rows = gson.fromJson(response.rows.replace(":", "-"), listOfListsOfStringsType);
请注意,这次我添加了.replace(":", "-")
,否则您会收到错误,因为:
被GSON解释为特殊字符(请参阅this)。
完成所有这些操作后,您将拥有字符串列表中的所有值,并且您将能够解析这些值并将其存储在您的课程中......
显然这不是最美丽的方式,但考虑到情况的困难,这是一个很好的解决方法......