我正在尝试使用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);
对象内部的所有内容均为空
但是,如果我使用
JSONArray
并将JSONObject
它们从org.json罐子中逐段拉出,效果很好,并相应地填充了字段。
关于我在做什么错的任何想法吗?Gson非常快吗?还是我最好坚持自己已经做的工作?
谢谢大卫
原始问题中的示例Java数据结构与注释中JSON结构的描述不匹配。
JSON被描述为
“由{object组成的数组,具有{object}组成的数组}”。
就问题中描述的类型而言,将JSON转换为与JSON结构匹配的Java数据结构,以便通过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结构来匹配最初提供的Java数据结构,该JSON结构实际上是“
{TypeDTO对象的数组与{ItemDTO对象}的数组的数组”)。
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)是最慢的。据报道,Gson的当前版本和下一版本都对性能进行了重大改进,尽管我没有寻找支持这些说法的最新性能测试数据。
就是说,如果Gson足够快地满足您的需求,那么由于JSON反序列化非常容易,因此使用它可能很有意义。如果需要更好的性能,那么Jackson可能是更好的选择。它提供了Gson的很多(甚至是全部)便利。
还是我最好坚持自己已经做的工作?
我不会 我最希望的只是一行简单的代码,例如
TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
…以便轻松地将其反序列化为复杂的数据结构,而不是一次需要将各段映射到一个组件的三十行代码。
我像这样接收JSON 当然,我实现了包含所有字段和类的类Track、Album和Playlist 顺便说一句,我不能改变JSON。所以我需要一个代码来解析它。
打完电话后 我只填充了的和。列表始终保持。我怎么才能修好这个?
问题内容: 我有一些奇怪的JSON,如: 基于某个字段,数组中的对象是某种类型。使用Gson,我的想法是要拥有一个TypeAdapterFactory,它将那些特定类型的委托适配器发送到TypeAdapter,但是我一直挂在理解读取“ type”字段以了解要创建哪种类型的一种好方法上。在TypeAdapter中 会假设“类型”字段在我的JSON中排在首位。有消除这种假设的不错方法吗? 问题答案:
当我试图使用Gson库反序列化JSON对象数组时,我遇到了一个问题。 JSON数组的一个示例: 你怎么认为?反序列化这种JSON响应的正确Java代码是什么?
问题内容: 我在尝试使用Gson库反序列化对象的JSON数组时遇到问题。 JSON数组的示例: 你怎么看?反序列化此类JSON响应的正确Java代码是什么? 问题答案: 要反序列化JSONArray,您需要使用TypeToken。您可以从GSON用户指南中了解更多信息。示例代码: 如果您有JSONArray,则可以使用
问题内容: 我在反序列化以下json数组时遇到麻烦(对不起,大小): 如果将其粘贴到json-viewer中,则会得到以下结构: 现在,包含具有坐标的数组的数组具有可变大小。所以我想在Java中,整个对象应该是一个数组,其中包含数组的集合,每个数组都包含一个。就像是 但是gson不接受这一点。我收到以下错误消息: 这似乎很奇怪,因为对我来说好像不像一个数组。但这可能使我感到困惑,或多或少地迷路了…