Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在单个java对象中反序列化json的父节点和子节点数据_Java_Json_Gson - Fatal编程技术网

在单个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"

我是Java新手,在将json数据转换为Java对象时遇到了问题。假设我的json格式是

{
  "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(....)