0

我正在尝试将 fusiontables sql 响应放入 android 中的 sqlite db。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
4

1 回答 1

2

in 的值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;
}

然后你必须解析你的响应(假设你的 JSON 响应在 String 中jsonString):

Gson gson = new Gson();
Response response = gson.fromJson(jsonString, Response.class);

现在您有了一个Response具有 3 个属性的类,这些属性代表 JSON 响应中的 3 个字符串(columnskindrows

现在您必须重新解析这些字符串,如下所示:

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)。

完成所有这些后,您将拥有字符串列表中的所有值,并且您将能够解析这些值并将它们存储在您希望的类中......

显然这不是最漂亮的方式,但考虑到情况的难度,这是一个很好的解决方法......

于 2013-05-03T11:03:55.680 回答