GSON(或)JSON到包含数组数组的contentvalues

时间:2013-05-03 01:57:11

标签: arrays json sqlite gson

我试图在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

1 个答案:

答案 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个字符串(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)。

完成所有这些操作后,您将拥有字符串列表中的所有值,并且您将能够解析这些值并将其存储在您的课程中......

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