如何解析内部数组json

时间:2016-08-08 13:35:27

标签: java json gson retrofit

我有json:

{
  "id": 1,
  "result": [
    {
      "id": 1,
      "imgUrl": "http://test.com/image.jpg",
      "title": "image"
    },
    {
      "id": 2,
      "imgUrl": "http://test.com/image2.jpg",
      "title": "image2"
    } 
  ],
  "jsonrpc": "2.0"
}

我如何解析内部数组,我尝试使用模型

进行默认的retroif gson解析
public class TestRequest {

    public int id;
    public List<ArrayItems> result;
    public String jsonrpc;    
}

public class Item {

   public int id;
   public String imgUrl;
   public String title;
}

我有错误:预计BEGIN_OBJECT但是BEGIN_ARRAY。 然后我尝试手工解析

Item[] items = GSON.fromJson(json, Item[].class);

并有错误:

  

预计BEGIN_ARRAY但是BEGIN_OBJECT。

我们该怎么做?

1 个答案:

答案 0 :(得分:3)

主要问题是您的 POJO 中有List<Item>,并且您将Item[].class传递给解析器,但不匹配。

Item[] items = GSON.fromJson(json, Item[].class);
//                                 ↑ here!!!!

无论如何,恕我直言,这不是解析这个Json的正确方法。

  • 您有一个json响应,主对象包含3个标记(id resultjsonrpc)。
  • 您创建了类似于表示此主要对象(TestRequest
  • 的Java POJO

... Soooooooo

使用IT!

根据这个,如果你解析主对象,你将拥有所有json内容。

TestRequest data = gson.fromJson(reader, TestRequest.class);

现在,让我们测试一下,为了获得友好的输出,我以这种方式覆盖Item::toString()

class Item {

    public int id;
    public String imgUrl;
    public String title;

    @Override
    public String toString() {
        return this.id + "-" + this.title;
    }
}

我使用这个main方法进行了测试:

final String FILE_PATH      = "C:\\tmp\\38830664.json"; // use your own!!!

Gson gson = new Gson();
JsonReader reader = new JsonReader(new FileReader(FILE_PATH));
TestRequest data = gson.fromJson(reader, TestRequest.class);

for (Item i :data.result)
    System.out.println(i);

<强>输出:

1-image
2-image2