Значение в 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).
После того, как вы все это сделали, у вас будут все ваши значения в списках строк, и вы сможете проанализировать эти значения и сохранить их в своих классах по своему усмотрению ...
Очевидно, что это не самый красивый способ, но это хорошее временное решение, принимая во внимание сложность ситуации ...
Я не понимаю ... как же ваш ответ JSON выглядеть точно? Я имею в виду, не после разбора его, но, как вы его получите ... Каков ваш класс 'SyncResponse', и каков результат' SyncResponse.toString() '? – MikO
SyncResponse - это запрос sqlresponse из запроса sqlGet, содержащего fustiontables. То, что я написал, является именно тем, что было ответом. Я только что нашел это упоминание о проблеме, я думаю, она еще не исправлена. [Fusiontables issue 545] (https://code.google.com/p/google-api-java-client/issues/detail?id=545) – Yale
ОК, поэтому я понимаю, что вы НЕ МОЖЕТЕ изменить ответ JSON, как я сказал в мой ответ, и вы должны разобрать ответ JSON, когда вы его написали, не так ли? – MikO