Gson和反序列化包含数组的对象数组

Dav*_*ave 64 java json gson

我试图使用Gson反序列化从我的webservice返回的json字符串

该结构将作为返回TypeDTO[].

这里TypeDTO就像是

int id;
String name;
ArrayList<ItemDTO> items[] 
Run Code Online (Sandbox Code Playgroud)

和ItemDTO就像

int id;
String name;
Boolean valid;
Run Code Online (Sandbox Code Playgroud)

当我调用代码如下

Gson gson = new Gson();
TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class);
Run Code Online (Sandbox Code Playgroud)

对象内的所有内容都为null

但是,如果我使用的话

JSONArray并且JSONObject从org.json罐中逐个拉出它们,它工作正常并且字段相应地填充.

关于我做错了什么的任何想法?Gson非常快吗?或者我最好坚持我已经工作的东西?

谢谢,大卫

Pro*_*uce 117

原始问题中的示例Java数据结构与注释中的JSON结构的描述不匹配.

JSON被描述为

"一个{object with a array of {object}}"的数组.

根据问题中描述的类型,将JSON转换为与JSON结构匹配的Java数据结构,以便与Gson轻松反序列化,

"一个{TypeDTO对象的数组,其数组为{ItemDTO object}}".

但问题中提供的Java数据结构不是这个.相反,它是

"一个{TypeDTO对象的数组,其数组的数组为{ItemDTO object}}".

二维数组!=一维数组.

第一个示例演示了使用Gson简单地反序列化和序列化JSON结构,该结构是"具有{object}}数组的对象的数组".

input.json内容:

[
  {
    "id":1,
    "name":"name1",
    "items":
    [
      {"id":2,"name":"name2","valid":true},
      {"id":3,"name":"name3","valid":false},
      {"id":4,"name":"name4","valid":true}
    ]
  },
  {
    "id":5,
    "name":"name5",
    "items":
    [
      {"id":6,"name":"name6","valid":true},
      {"id":7,"name":"name7","valid":false}
    ]
  },
  {
    "id":8,
    "name":"name8",
    "items":
    [
      {"id":9,"name":"name9","valid":true},
      {"id":10,"name":"name10","valid":false},
      {"id":11,"name":"name11","valid":false},
      {"id":12,"name":"name12","valid":true}
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

Foo.java:

import java.io.FileReader;
import java.util.ArrayList;

import com.google.gson.Gson;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
    System.out.println(gson.toJson(myTypes));
  }
}

class TypeDTO
{
  int id;
  String name;
  ArrayList<ItemDTO> items;
}

class ItemDTO
{
  int id;
  String name;
  Boolean valid;
}
Run Code Online (Sandbox Code Playgroud)

第二个示例使用JSON结构,该结构实际​​上是"{NumberDTO对象的数组,其数组的数组为{ItemDTO object}}"以匹配最初提供的Java数据结构.

input.json内容:

[
  {
    "id":1,
    "name":"name1",
    "items":
    [
      [
        {"id":2,"name":"name2","valid":true},
        {"id":3,"name":"name3","valid":false}
      ],
      [
        {"id":4,"name":"name4","valid":true}
      ]
    ]
  },
  {
    "id":5,
    "name":"name5",
    "items":
    [
      [
        {"id":6,"name":"name6","valid":true}
      ],
      [
        {"id":7,"name":"name7","valid":false}
      ]
    ]
  },
  {
    "id":8,
    "name":"name8",
    "items":
    [
      [
        {"id":9,"name":"name9","valid":true},
        {"id":10,"name":"name10","valid":false}
      ],
      [
        {"id":11,"name":"name11","valid":false},
        {"id":12,"name":"name12","valid":true}
      ]
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

Foo.java:

import java.io.FileReader;
import java.util.ArrayList;

import com.google.gson.Gson;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
    System.out.println(gson.toJson(myTypes));
  }
}

class TypeDTO
{
  int id;
  String name;
  ArrayList<ItemDTO> items[];
}

class ItemDTO
{
  int id;
  String name;
  Boolean valid;
}
Run Code Online (Sandbox Code Playgroud)

关于其余两个问题:

Gson非常快吗?

与其他反序列化/序列化API不相比.传统上, Gson 是最慢的.据报道,Gson的当前和下一版本包括显着的性能改进,但我没有寻找最新的性能测试数据来支持这些声明.

也就是说,如果Gson足够快以满足您的需求,那么因为它使JSON反序列化变得如此简单,所以使用它可能是有意义的.如果需要更好的性能,那么杰克逊可能是更好的选择.它提供了很多(甚至可能是所有)Gson的便利.

或者我最好坚持我已经工作的东西?

我不会.我总是宁愿有一行简单的代码

TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
Run Code Online (Sandbox Code Playgroud)

...轻松地反序列化为复杂的数据结构,而不是将一个组件一次映射到一个组件所需的三十行代码.

  • @Programmer Bruce +1代表"宁可拥有一条简单的代码".GSON的强大之处在于解析的速度有多快,但编写和维护大量生产案例所需的代码的速度有多快.当您需要优化时,GSON的流媒体模型确实可以提供出色的性能提升. (8认同)