2013-05-03 2 views
0

Я пытаюсь получить SQL-запрос слияния в sqlite-db в android. jsonlint.com говорит, что объект действителен JSON. Но массивы в «строках» не распознаются как JsonArrays или JSONArrays. Количество строк в ответе sql может отличаться. Ниже приведен пример ответа. Я был бы признателен за любую помощь в том, чтобы указывать мне в правильном направлении решения. Даже помогая мне задавать лучший вопрос. Я в тупике!GSON (или) JSON для contentvalues ​​с массивом массивов

{ 
"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

Я не понимаю ... как же ваш ответ JSON выглядеть точно? Я имею в виду, не после разбора его, но, как вы его получите ... Каков ваш класс 'SyncResponse', и каков результат' SyncResponse.toString() '? – MikO

+0

SyncResponse - это запрос sqlresponse из запроса sqlGet, содержащего fustiontables. То, что я написал, является именно тем, что было ответом. Я только что нашел это упоминание о проблеме, я думаю, она еще не исправлена. [Fusiontables issue 545] (https://code.google.com/p/google-api-java-client/issues/detail?id=545) – Yale

+0

ОК, поэтому я понимаю, что вы НЕ МОЖЕТЕ изменить ответ JSON, как я сказал в мой ответ, и вы должны разобрать ответ JSON, когда вы его написали, не так ли? – MikO

ответ

2

Значение в rows не распознается как массив, потому что это не массив!

У вас есть двойные кавычки до и после квадратных скобок: "[...]", т. Е. У вас есть только строка ... Эта строка содержит представление массива JSON, но его нельзя рассматривать как массив. ..

Правильный ответ JSON в вашем случае должен быть примерно следующим. Обратите внимание, что все значения, которые являются строки записываются в двойные кавычки, но массивы (и номера) не surronded двойные кавычки ...

{ 
    "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] 
    ] 
} 

EDIT: Прежде всего, отметим, что, как я сказал ранее, ваш ответ JSON недействителен ... ну, лучше сказал, он действителен, но он не представляет элементы JSON правильно, но он представляет их как строки ...

Это говорит о том, что я придумал следующий обходной путь:

Прежде всего, вам нужен класс до завернуть ваш ответ JSON, в вашем случае что-то вроде:

public class Response { 
    public String columns; 
    public String kind; 
    public String rows; 
} 

Затем вы должны проанализировать свой ответ с (если у вас есть свой ответ JSON в строку jsonString):

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

Теперь вы имеют класс Response с 3 атрибутами, представляющими 3 строки в ответе JSON (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", ...

Наконец вы должны сделать somethig похожи с колонками, но в этом случае это не список, а список списков:

Type listOfListsOfStringsType = new TypeToken<List<List<String>>>() {}.getType(); 
List<List<String>> rows = gson.fromJson(response.rows.replace(":", "-"), listOfListsOfStringsType); 

Примечание: что на этот раз я добавил .replace(":", "-"), потому что в противном случае вы получите ошибку, потому что : интерпретируется GSON как особый символ (см. this).

После того, как вы все это сделали, у вас будут все ваши значения в списках строк, и вы сможете проанализировать эти значения и сохранить их в своих классах по своему усмотрению ...

Очевидно, что это не самый красивый способ, но это хорошее временное решение, принимая во внимание сложность ситуации ...

+0

Спасибо MikO, я был бы признателен за помощь в разборе с GSON. Я могу разобрать все это как JsonObject. Я добавлю код для синтаксического анализа. – Yale

+0

Вы нашли мой ответ полезным? Если нет, вы можете спросить, и я постараюсь помочь ... – MikO

+0

Спасибо! Это сработало. Я определенно был в тупике. – Yale

Смежные вопросы