Использование Gson для создания массивов объектов

1

Я хотел бы преобразовать эту строку JSON в массивы объектов, которые я могу манипулировать на Java.

String jsonExample = "" +
            "{"c":[{"v":"03/10/2013"},{"v":23},{"v":112}]},"+
            "{"c":[{"v":"04/10/2013"},{"v":14},{"v":232}]},"+
            "{"c":[{"v":"05/10/2013"},{"v":18},{"v":145}]},"+
            "{"c":[{"v":"06/10/2013"},{"v":22},{"v":211}]},"+
            "{"c":[{"v":"07/10/2013"},{"v":18},{"v":198}]},"+
            "{"c":[{"v":"08/10/2013"},{"v":15},{"v":215}]}";

Во-первых, я его игнорирую:

String unescape = StringEscapeUtils.unescapeHtml4(jsonExample2);

Затем я пытаюсь использовать Гсона,

Gson gson = new Gson();
ViewsHistoric viewHistoric = gson.fromJson(unescape, ViewsHistoric.class);

со следующими классами:

    public static class ViewsHistoric {
    private List<Row> r;
    public List<Row> getR() {return r;}
    public ViewsHistoric() {}
}

public static class Row {
    private Triplet c;
    public Triplet getC() {return c;}
    public Row() {}
}

public static class Triplet {
    private String v;

    public String getV() {return v; }
    public Triplet() {}
}

Но я получаю сообщение об ошибке:

java.lang.IllegalStateException: ожидается BEGIN_OBJECT, но был STRING в строке 1 столбца 2

Ну, на самом деле, я пробовал много других комбинаций классов с Гсеном с последними часами, но без везения.

Может ли кто-нибудь сказать мне, как преобразовать эту строку json в java-объекты?

  • 3
    Это не похоже на действительный JSON. Начнем с просмотра формата JSON . Обратите внимание, что JSON OBJECT отображается на объект Java, а JSON ARRAY - на массив Java (или тип Collection ).
Теги:
gson

2 ответа

1
Лучший ответ

Две вещи:

  1. Ваш JSON был в недопустимом формате (даже после отмены).
  2. Класс Triplet - это объект, а не массив JSON.

Я сделал несколько изменений в вашем коде, чтобы заставить его работать. Здесь у вас есть рабочий пример

public class Q24000071 {

    public static void main(String[] args) {
             //the 'r' attribute, corresponding to 'ViewsHistoric' class, was missing
        String jsonExample = "{\"r\": ["
                + "{&#34;c&#34;:[{&#34;v&#34;:&#34;03/10/2013&#34;},{&#34;v&#34;:23},{&#34;v&#34;:112}]},"
                + "{&#34;c&#34;:[{&#34;v&#34;:&#34;04/10/2013&#34;},{&#34;v&#34;:14},{&#34;v&#34;:232}]},"
                + "{&#34;c&#34;:[{&#34;v&#34;:&#34;05/10/2013&#34;},{&#34;v&#34;:18},{&#34;v&#34;:145}]},"
                + "{&#34;c&#34;:[{&#34;v&#34;:&#34;06/10/2013&#34;},{&#34;v&#34;:22},{&#34;v&#34;:211}]},"
                + "{&#34;c&#34;:[{&#34;v&#34;:&#34;07/10/2013&#34;},{&#34;v&#34;:18},{&#34;v&#34;:198}]},"
                + "{&#34;c&#34;:[{&#34;v&#34;:&#34;08/10/2013&#34;},{&#34;v&#34;:15},{&#34;v&#34;:215}]}"
                + "]}";

        String unescape = StringEscapeUtils.unescapeHtml4(jsonExample);
        System.out.println(unescape);

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        ViewsHistoric viewHistoric = gson.fromJson(unescape,
                ViewsHistoric.class);
        System.out.println(gson.toJson(viewHistoric));
    }

    public static class ViewsHistoric {

        private List<Row> r;

        public List<Row> getR() {
            return r;
        }

        public ViewsHistoric() {
        }
    }

    public static class Row {

        // Triplet is an array in the original JSON
            // of three elements, but an array.
        private Triplet[] c;

        public Triplet[] getC() {
            return c;
        }

        public Row() {
        }
    }

    public static class Triplet {

        private String v;

        public String getV() {
            return v;
        }

        public Triplet() {
        }
    }
}
  • 0
    Да уж! оно работает! Спасибо!!
1

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

Здесь результат: Map<String, List<Row>> где имеется только один ключ r а значение - список объектов Row.


Образец кода:

Type type = new TypeToken<Map<String, List<Row>>>() {}.getType();
Map<String, List<Row>> data = new Gson().fromJson(reader, type);

System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));

Класс POJO:

class Row {
    private List<Triplet> c;
    // getter & setter
}

class Triplet {
    private String v;
    // getter & setter
}

вывод в симпатичном формате:

{
  "r": [
    {
      "c": [
        {
          "v": "03/10/2013"
        },
        {
          "v": "23"
        },
        {
          "v": "112"
        }
      ]
    },
    {
      "c": [
        {
          "v": "04/10/2013"
        },
        {
          "v": "14"
        },
        {
          "v": "232"
        }
      ]
    },
    {
      "c": [
        {
          "v": "05/10/2013"
        },
        {
          "v": "18"
        },
        {
          "v": "145"
        }
      ]
    },
    {
      "c": [
        {
          "v": "06/10/2013"
        },
        {
          "v": "22"
        },
        {
          "v": "211"
        }
      ]
    },
    {
      "c": [
        {
          "v": "07/10/2013"
        },
        {
          "v": "18"
        },
        {
          "v": "198"
        }
      ]
    },
    {
      "c": [
        {
          "v": "08/10/2013"
        },
        {
          "v": "15"
        },
        {
          "v": "215"
        }
      ]
    }
  ]
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню