Gson ожидал СТРОКУ, но был BEGIN_ARRAY?

#java #json #gson

#java #json #gson

Вопрос:

Я пытаюсь проанализировать строку JSON, подобную этой (строка Json получена из онлайн-API)

 [
 [
  [
   {
    "id": 0, 
    "number": 22,
    "arg": []
   }, 
   {
    "id": 1, 
    "number": 1, 
    "arg": [
     {
      "id": 0, 
      "type": "A0", 
      "beg": 0, 
     }, 
     {
      "id": 1, 
      "type": "A1", 
      "beg": 2, 
     }
    ]
   }   
  ]
 ]
]
  

Я использую библиотеку Gson для java.
Моя работа состоит в том, чтобы получить значение атрибута «number». Чтобы сделать это, я думаю, мне нужно сделать:

 jsonobject = something(???)
number = jsonobject[0][0][1]["number"]
  

Поэтому я пытаюсь:

 Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonArray jArray = parser.parse(jstring).getAsJsonArray();
for(JsonElement obj : jArray )
{

String cse = gson.fromJson( obj , String.class);
System.out.println(cse);
}
  

однако java жалуется: ожидаемая СТРОКА, но была BEGIN_ARRAY, из этой строки:

 String cse = gson.fromJson( obj , String.class);
  

есть мысли? заранее спасибо.

Комментарии:

1. Является ли это допустимой строкой JSON. Проверьте это здесь jsonlint , в котором говорится Parse error on line 18:

2. @Braj не обязательно. Во всяком случае, у меня такое чувство, что вложенные списки (которые кажутся бесполезными) вызывают это

3. да @TimCastelijns я согласен с вами. Просто удаляю мой комментарий. Извините.

Ответ №1:

Он возвращается ArrayList<ArrayList<ArrayList<Map<String, Object>>>> .

 Type type = new TypeToken<ArrayList<ArrayList<ArrayList<Map<String, Object>>>>>() {}.getType();
ArrayList<ArrayList<ArrayList<Map<String, Object>>>> data = gson.fromJson(json, type);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));
  

Или вы также можете преобразовать в объект JAVA

 class MyJSONObj{
    private double id;
    private double number;
    private List<MyArgJson> arg;
    // getter amp; setter
}

class MyArgJson{
    private double id;
    private String type;
    private double beg;
    // getter amp; setter
}

Type type = new TypeToken<ArrayList<ArrayList<ArrayList<MyJSONObj>>>>() {}.getType();
ArrayList<ArrayList<ArrayList<MyJSONObj>>> data = gson.fromJson(json, type);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));
  

вывод:

 [
  [
    [
      {
        "id": 0.0,
        "number": 22.0,
        "arg": []
      },
      {
        "id": 1.0,
        "number": 1.0,
        "arg": [
          {
            "id": 0.0,
            "type": "A0",
            "beg": 0.0
          },
          {
            "id": 1.0,
            "type": "A1",
            "beg": 2.0
          }
        ]
      }
    ]
  ]
]