在单个java对象中反序列化json的父节点和子节点数据
我是Java新手,在将json数据转换为Java对象时遇到了问题。假设我的json格式是在单个java对象中反序列化json的父节点和子节点数据,java,json,gson,Java,Json,Gson,我是Java新手,在将json数据转换为Java对象时遇到了问题。假设我的json格式是 { "totalSize" : 2, "done" : true, "Id" : "xyz", "Name" : "P0000005239", "child" : { "Type" : "someType", "Region" : "someRegion", "Name" : "C001906"
{
"totalSize" : 2,
"done" : true,
"Id" : "xyz",
"Name" : "P0000005239",
"child" : {
"Type" : "someType",
"Region" : "someRegion",
"Name" : "C001906"
},
"Address_1" : "Address_1",
"Address_2" : "Address_1"
}
如果我的java类结构是这样的,那么反序列化正在工作
//Working class Structure
class Demo{
int total_Size;
boolean flag_done;
String ID;
String p_name;
Child child;
String Address1;
String Address2;
//getter and setter
}
但我的类结构是(我无法映射到json)
错误
Invocation of init method failed; nested exception is
com.google.gson.JsonParseException: The JsonDeserializer
com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@4b28f983 failed to
deserialized json object
如何从json创建java对象,使所有数据都在单个类中(即父节点和子节点数据在单个类中,而不声明单独的子类)
我使用带有@SerializedName注释的GSON将json转换为java对象。如果您需要更多详细信息,请告诉我。尝试使用fasterxml 为此,您需要在JSON中传递其他信息:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,
include=JsonTypeInfo.As.PROPERTY, property="@type")
class Base {
...
}
然后在序列化时,它将添加@type字段:
objectMapper.registerSubtypes(
new NamedType(ConcreteAAdapter.class, "ConcreteA"),
new NamedType(ConcreteBAdapter.class, "ConcreteB"),
new NamedType(ConcreteCAdapter.class, "ConcreteC")
);
//注意,对于列表,您需要显式地传递TypeReference
objectMapper.writerWithType(new TypeReference<List<Base>>() {})
.writeValueAsString(someList);
{
"@type" : "ConcreteA",
...
}
on deserialization it will be:
objectMapper.registerSubtypes(
new NamedType(ConcreteA.class, "ConcreteA"),
new NamedType(ConcreteB.class, "ConcreteB"),
new NamedType(ConcreteC.class, "ConcreteC")
);
objectMapper.readValue(....)
objectMapper.writerWithType(新类型引用(){})
.writeValueAsString(someList);
{
“@type”:“ConcreteA”,
...
}
反序列化时,它将是:
objectMapper.registerSubtypes(
新名称类型(ConcreteA.class,“ConcreteA”),
新名称类型(ConcreteB.class,“ConcreteB”),
新名称类型(ConcreteC.class,“ConcreteC”)
);
objectMapper.readValue(..)
更多信息:您是否创建了包含您的c_类型、c_区域和c_名称的子类?如果我创建的是子类,那么它可以工作,但我希望所有属性都在一个类中(问题中的第二个类)。看起来您要么创建自己的JSON解析器,要么将创建的每个演示对象的信息从其子类迁移到c_uu变量中。有关GSON功能的更多信息,请参阅此处,这里已经给出了答案。希望这有帮助。
objectMapper.writerWithType(new TypeReference<List<Base>>() {})
.writeValueAsString(someList);
{
"@type" : "ConcreteA",
...
}
on deserialization it will be:
objectMapper.registerSubtypes(
new NamedType(ConcreteA.class, "ConcreteA"),
new NamedType(ConcreteB.class, "ConcreteB"),
new NamedType(ConcreteC.class, "ConcreteC")
);
objectMapper.readValue(....)