Java 我如何使用谷歌&x27;如何正确地反序列化JSON?
简而言之,这是我想用JAVA解析的JSON对象的草图:Java 我如何使用谷歌&x27;如何正确地反序列化JSON?,java,json,api,gson,serialization,Java,Json,Api,Gson,Serialization,简而言之,这是我想用JAVA解析的JSON对象的草图: { object1: { item1: //[String | Array | Object] , item2: // ... //<> more items object2: { /* .. */ } //<> more objects } (2) 嵌套对象的表示形式: public class JObject {
{
object1: {
item1: //[String | Array | Object] ,
item2: // ...
//<> more items
object2: { /* .. */ }
//<> more objects
}
(2) 嵌套对象的表示形式:
public class JObject {
private String id ;
private List<JNode> jObjects ;
public JObject() { }
//get & set methods
}
每当我尝试访问可解析对象时(例如,通过列表迭代器
),我都会得到一个NullPointerException
。但是,Gson确实创建了I类指定的对象,并且不会引发任何后续错误
我知道这是以前做过的。那么,我错过了什么
这是不可能的。您需要修改JSON结构,将
object1
、object2
等表示为数组的项。现在,它们是一个对象的属性,显然不知道其中有多少(否则,您没有尝试将其映射为列表
)。Gson很聪明,但没那么聪明:)
因此,作为一个基本示例,此JSON结构包含一个数组:
{ nodes:
[
{ item1: 'value1a', item2: 'value2a' },
{ item1: 'value1b', item2: 'value2b' },
{ item1: 'value1c', item2: 'value2c' }
]
}
结合Java表示(不一定称为POJO,而只是javabean或model对象或value对象)
应该有用
更新:需要明确的是,问题在于JSON结构,而不是Java对象结构。假设您的Java对象结构正是您希望得到的,那么您的JSON结构应该如下所示,以使Gson完成其工作:
{ jObjects:
[
{ id: 123, jObjects:
[
{ item1: 'value1a', item2: 'value2a' },
{ item1: 'value1b', item2: 'value2b' },
{ item1: 'value1c', item2: 'value2c' }
/* etc... commaseparated */
]
},
{ id: 456, jObjects:
[
{ item1: 'value1d', item2: 'value2d' },
{ item1: 'value1e', item2: 'value2e' },
{ item1: 'value1f', item2: 'value2f' }
/* etc... commaseparated */
]
}
/* etc... commaseparated */
]
}
只有
JsonElement
属性应该替换为String
,因为它是无效的。我认为BalusC为wrt GSon(通常是一对一的数据绑定)的特定问题提供了很好的指针;但是,如果你认为应该有更多的动态处理,你也可以考虑其他JSON处理包。许多软件包都有额外的或可供选择的映射方式:Json lib、flexjson和Jackson与Gson相比至少有额外的映射方式。有些提供了更松散的映射(您可以将事物的名称定义为类型),有些则实际支持多形类型(声明一个对象,但实际上可以映射到序列化的子类型)。您好,谢谢您的回答!我打算维护标识符字符串(例如,Object1
),以便能够正确解析容器类的内容,就像在JavaScript中一样。你知道怎么做吗?如果那些标识符字符串绑定到每个项目(节点
),而不是容器(节点
),那么你需要将其作为节点
的属性。具有未知数量属性和未知属性名称的JS对象根本不是一个好主意/实践。你需要把它们放在一个数组中,并给数组一个固定的名称。这有点超出了使用JSON的目的。如果我不能在JAVA中镜像JSON的对象映射样式,我还可以编写自己的API我基本上是在保留标识符字符串的同时尝试做与此>中相同的事情。您链接的主题基本上显示和回答相同:使用数组属性。你的问题只是对基本OO原则的误解/误解,而不是JSON/Java。是的,我知道。您需要在JSON端将这些项分组到一个数组中,使用[
和]
东西来标识其开始和结束。只有这样,您才能在列表中收集它们。再次检查我的答案和该主题中的代码示例。我想可能也有用。嗨,谢谢你的回答。实际上,我不太确定GSON内部是如何工作的,因此不太了解如何使用它。我现在使用Rhino的自定义解析,这在我看来更方便。Java不像JavaScript那样简单地支持嵌套数据对象,因此没有真正的理由不使用Rhino来实现这类功能。
Gson gson = new Gson() ;
JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ;
{ nodes:
[
{ item1: 'value1a', item2: 'value2a' },
{ item1: 'value1b', item2: 'value2b' },
{ item1: 'value1c', item2: 'value2c' }
]
}
public class Container {
private List<Node> nodes;
// +getter.
}
public class Node {
private String item1;
private String item2;
// +getters.
}
Container container = new Gson().fromJson(json, Container.class);
{ jObjects:
[
{ id: 123, jObjects:
[
{ item1: 'value1a', item2: 'value2a' },
{ item1: 'value1b', item2: 'value2b' },
{ item1: 'value1c', item2: 'value2c' }
/* etc... commaseparated */
]
},
{ id: 456, jObjects:
[
{ item1: 'value1d', item2: 'value2d' },
{ item1: 'value1e', item2: 'value2e' },
{ item1: 'value1f', item2: 'value2f' }
/* etc... commaseparated */
]
}
/* etc... commaseparated */
]
}