0

Android の sqlite db に 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
4

1 に答える 1

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;
}

次に、レスポンスを次のように解析する必要があります (JSON レスポンスが String にあると仮定しますjsonString):

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

これで、JSON 応答 ( 、および)Responseの 3 つの文字列を表す 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);

今回は追加したことに注意してください。そうしないと、GSON によって特殊文字として解釈される.replace(":", "-")ため、エラーが発生するためです (これを参照してください)。:

これをすべて完了すると、すべての値が文字列のリストに含まれ、これらの値を解析して、必要に応じてクラスに格納できるようになります...

明らかに、これは最も美しい方法ではありませんが、状況の難しさを考慮すると良い回避策です...

于 2013-05-03T11:03:55.680 に答える