Я хотел бы преобразовать эту строку 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-объекты?
Две вещи:
Triplet
- это объект, а не массив JSON.Я сделал несколько изменений в вашем коде, чтобы заставить его работать. Здесь у вас есть рабочий пример
public class Q24000071 {
public static void main(String[] args) {
//the 'r' attribute, corresponding to 'ViewsHistoric' class, was missing
String jsonExample = "{\"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}]}"
+ "]}";
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() {
}
}
}
Просто попробуйте ниже пример кода после внесения небольших изменений в вашу фактическую строку 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"
}
]
}
]
}
Collection
).