【问题标题】:Gson and deserializing an array of objects with arrays in itGson 并反序列化包含数组的对象数组
【发布时间】:2010-09-21 19:54:25
【问题描述】:

我正在尝试使用 Gson 反序列化从我的 web 服务返回的 json 字符串

结构将返回为TypeDTO[]

TypeDTO 在哪里

int id;
String name;
ArrayList<ItemDTO> items[] 

ItemDTO 就像

int id;
String name;
Boolean valid;

当我如下调用代码时

Gson gson = new Gson();
TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class);

对象内的一切都是空的

但是,如果我使用

JSONArrayJSONObject 将它们从 org.json jar 中一块一块地拉出来,它工作正常,并且相应地填充了字段。

关于我做错了什么有什么想法吗? Gson 非常快吗? 还是我最好坚持我已经开始的工作?

谢谢, 大卫

【问题讨论】:

  • 您需要提供更多信息。您收到的 JSON 格式是什么?为什么你的TypeDTO 中有一个ArrayList 数组? Gson 可以很好地处理这类事情。
  • 我以为我给出了 JSON 的清晰图片。顶层是对象列表。每个对象都有多个 kv 对,其中一个是另一个具有更多 kv 对的对象列表。
  • @daviedave : 我认为程序员布鲁斯的回答应该被标记为接受

标签: java json gson


【解决方案1】:

原题中的示例Java数据结构与评论中JSON结构的描述不符。

JSON 被描述为

“一个 {object 数组和一个 {object}} 数组”。

就问题中描述的类型而言,转换为Java数据结构的JSON将匹配JSON结构以便于用Gson进行反序列化

“{TypeDTO 对象数组和 {ItemDTO 对象}} 数组”。

但是问题中提供的Java数据结构不是这个。取而代之的是

“{TypeDTO 对象数组和 {ItemDTO 对象}} 数组数组”。

二维数组!= 一维数组。

第一个示例演示了使用 Gson 简单地反序列化和序列化 JSON 结构,该结构是“{object 数组和 {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}
    ]
  }
]

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;
}

第二个示例改为使用 JSON 结构,该结构实际​​上是“{TypeDTO 对象数组和 {ItemDTO 对象}} 数组”来匹配最初提供的 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}
      ]
    ]
  }
]

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;
}

关于剩下的两个问题:

Gson 非常快吗?

没有与其他反序列化/序列化 API 相比。 Gson 传统上是amongst slowest。据报道,Gson 的当前和下一个版本包括显着的性能改进,尽管我没有寻找最新的性能测试数据来支持这些说法。

也就是说,如果 Gson 的速度足以满足您的需求,那么既然它使 JSON 反序列化变得如此简单,那么使用它可能是有意义的。如果需要更好的性能,那么 Jackson 可能是一个更好的选择。它提供了 Gson 的许多(甚至全部)便利。

或者我最好还是坚持我已经在做的事情?

我不会。我总是宁愿有一行简单的代码,比如

TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);

...更容易反序列化为复杂的数据结构,而不是需要 30 行代码才能一次将各个部分映射到一个组件。

【讨论】:

  • 感谢您的解决方案,经过三个小时的徒劳尝试,您的方法是我找到的最好的。
  • @Programmer Bruce +1 表示“只有一行简单的代码”。 GSON 的强大不在于它解析多快,而在于它编写和维护大量生产案例所需的代码有多快。当您需要优化时,GSON 的流式传输模型确实提供了巨大的性能提升。
【解决方案2】:

如果您的 JSON 数据以数组对象开头,请像这样使用您的 bean 类。对你有帮助。

Users[] bean = gson.fromJson(response,Users[].class);

Users 是我的 bean 类。

响应是我的 JSON 数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2021-10-05
    相关资源
    最近更新 更多