Десериализация с помощью GSON

197
03 марта 2018, 20:04

Всем привет! Недавно увлекся программированием, и появилась необходимость десериализовать данные с помощью GSON (либо чего-то более подходящего), чтобы положить всё это в БД.

Ответ сервера примерно такой (получаю в jsoup Document):

  теги html и body
  4887854839908
  <!---->
  <!---->0
  <!---->6879
  <!---->0
  <!---->
  <!--json-->
  {"key":"value", "key":"value", "key":"value", "key":"value",
    "list":[
       ["value1", "value2", "value3", "value4", "value5", "value6"],
       ["value1", "value2", "value3", "value4", "value5", "value6"],
       ["value1", "value2", "value3", "value4", "value5", "value6"],
       .....
       ..... 
       .....
       ],
    "key":"value", "key":"value", "key":"value", "key":"value"}
   <!---->
      ...... //Здесь куча div классов
    <!---->
    <!--json-->
    {"key":"value", "key":"value", "key":"value", "key":"value",
      "key":"value", "key":"value", "key":"value", "key":"value"}
    <!---->
      ...... //опять div классы

Отсюда нужно вытащить массив значений "list" и несколько "key":"value". Как всё это проще и грамотнее преобразовать?

Answer 1

Предположим, что JSON будет всегда отделяться от остального HTML при помощи данных в вашем примере тегов:

    String jsonCommentStart = "<!--json-->"; // это начало
    String jsonCommentEnd = "<!---->";       // это конец
    String str = "<html>...</html>" //ваша исходная строка

Тогда мы получим строку с JSON, отсекая все лишнее:

    int jsonContentsBegin = 
str.indexOf(jsonCommentStart) + jsonCommentStart.length(); //начало содержимого
    Log.i("TEST", "onCreate: " + jsonContentsBegin);
    //строка, начинающаяся сразу после <!--json-->
    String json = str.substring(jsonContentsBegin); 
    //окончание JSON
    int jsonContentsEnd = json.indexOf(jsonCommentEnd) + jsonContentsBegin; 
    Log.i("TEST", "onCreate: " + jsonContentsEnd);
    String jsonContents = str.substring(jsonContentsBegin, jsonContentsEnd);

Строка, содержащаяся в переменной jsonContents - и есть искомый json. Очищаем от лишнего и преобразуем в JSON:

jsonContents = jsonContents.trim();
try
{
    //объект, из которого вы сможете получать нужные данные
    JSONObject object = new JSONObject(jsonContents);
    Log.i("TEST", "onCreate:  JSON: " + object.toString());
} catch (JSONException e) {
    Log.i("TEST", "onCreate: " + e);
}

Чтобы получить второй, третий и т.д. JSON объект из HTML, возьмите подстроку, начинающуюся с позиции jsonContentsEnd. С этой подстрокой проведите те же действия, что я указывал выше.

Чтобы вытаскивать какие-то данные из JSON, используйте код:

object.getString(key); // - для строки
object.getJSONArray(key);// - для массива

Где key - это ключ какого-то либо значения. Больше информации тут

READ ALSO
Правильно-ли реализована агрегация?

Правильно-ли реализована агрегация?

Правильно-ли я создал агрегацию? В методе main я передаю значения как class Sim, так class Battery и вызываю метод printА могу ли я так передать их, но через...

218
Не работает переключатель для radio

Не работает переключатель для radio

Приветствую, товарищи! Есть вот такая разметка:

207
CKEditor 4 fileUploadResponse получить созданную ссылку

CKEditor 4 fileUploadResponse получить созданную ссылку

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

193