有没有办法告诉GSON在开始时解析带有类型名称的字符串?

时间:2011-06-22 16:58:26

标签: json jersey gson

来自Jersey的

List的经典JSON输出如下:

{"SubtaskType":{"id":"4","name":"mozaika","metric":"m2","code":"104"}}

但GSON会说它不是JSON数组,而且在实验上它接受:

{"id":"4","name":"mozaika","metric":"m2","code":"104"} for single SubtaskType.

我用JSON验证器测试了它,似乎两种形式都可以接受。

GSON的List输出如下:

[{"name":"aa","metric":"m2","id":1,"code":200},{"name":"bb","metric":"m","id":2,"code":300}]

有没有办法配置GSON来解析/生成更长的表单(带有类型名称)?

修改

这是结构(为更改/讨论而添加):

public class SubtaskType {
private int id;
private String name;
private String metric;
private int code;

//getters & setters
}

1 个答案:

答案 0 :(得分:0)

注意:此答案基于问题的原始版本。

  来自Jersey的

List的经典JSON输出如下:

{"SubtaskType":{"id":"4","name":"mozaika","metric":"m2","code":"104"}}

真的?那不是JSON数组,即列表。它是一个名为“SubtaskType”的元素的对象,元素的值是具有四个元素的对象。没有清单。

这就是具有单个组件的列表是什么样的?包含两个组件的列表是否像

一样出现
{"SubtaskType":[{"id":"4","name":"mozaika","metric":"m2","code":"104"},{"name":"bb","metric":"m","id":2,"code":300}}

如果是这种情况,并且您必须收到生成效果不佳的* JSON,并且您必须使用Gson,那么您将必须实现自定义反序列化处理来处理它有时是列表并且有时是对象的情况。这是一个经常发生的问题。遗憾的是,Gson还没有一个简单的配置来处理这个经常出现的问题。我发布了一个这样的自定义反序列化处理示例,以回应Parsing JSON with GSON, object sometimes contains list sometimes contains object

中的问题

*仅仅因为它是有效的JSON,并不意味着它不是废话。 API应该生成一致结构化的JSON。更糟糕的是废话。

  

GSON的List输出如下:

[{"name":"aa","metric":"m2","id":1,"code":200},{"name":"bb","metric":"m","id":2,"code":300}]

好。这就是JSON中的列表应该是什么样的。

  

有没有办法配置GSON来解析/生成更长的表单(带有类型名称)?

是。具体的解决方案取决于您的Java数据结构目前的样子,以及您是否能够更改结构以匹配所需的JSON。如果无法相应地更改Java数据结构,则必须自定义进程序列化/反序列化。发布您想要使用的Java数据结构,并指出是否可以更改它。

此外,发布您要生成的“更长形式”JSON的确切示例,该示例表示包含至少两个组件的列表。你还没有这样做。所以,它让我猜测你真正想做什么。

看起来很清楚,无论最终解决方案是什么,您都希望进行多态类型处理。如果使用Gson,这将需要自定义反序列化处理。

关于多态反序列化的任何问题,请注意该问题已经在StackOverflow.com上讨论了几次。我在Can I instantiate a superclass and have a particular subclass be instantiated based on the parameters supplied发布了四个不同的问题和答案(其中一些带有代码示例)的链接。

对于多态序列化,不仅可能需要实现自定义序列化来生成所需的类型元素,而且说服Gson从多态类型序列化所有字段也需要自定义处理。有关详细信息,请参阅Serializing List of Interfaces GSON