Java 解析同时包含对象和单个值的嵌套JSON

Java 解析同时包含对象和单个值的嵌套JSON,java,arrays,json,jackson,Java,Arrays,Json,Jackson,我相信这就是所谓的嵌套JSON,我想使用Jackson将其反序列化为对象。如果一个程序类有TrackedEntity和ProgramStage类型的示例对象(参见JSON代码),是否也可以将子对象自动解析为Java对象?或者,是否可以简单地解析各个对象的“id”,并将它们放入程序对象中的字符串中 JSON示例如下所示: { programs: [ { "id": "IpHINAT79UW", "created": "2013-03-04T10:41:07.494+0000",

我相信这就是所谓的嵌套JSON,我想使用Jackson将其反序列化为对象。如果一个程序类有TrackedEntity和ProgramStage类型的示例对象(参见JSON代码),是否也可以将子对象自动解析为Java对象?或者,是否可以简单地解析各个对象的“id”,并将它们放入程序对象中的字符串中

JSON示例如下所示:

{
programs: 
[
{
    "id": "IpHINAT79UW",
    "created": "2013-03-04T10:41:07.494+0000",
    "trackedEntity": 
    {
        "id": "cyl5vuJ5ETQ",
        "name": "Person"
    },
    "programStages":
    [
        {
            "id": "A03MvHHogjR",
        },
        {
            "id": "ZzYYXq4EJie",
        },
        {
            "id": "AREMvHHogjR",
        },
        {
            "id": "ZzYYXq4fJie",
        }
    ]
},
{
    "id": "IGRINAT79UW",
    "created": "2013-03-04T10:41:07.494+0000",
    "trackedEntity": 
    {
        "id": "cyl5vuJ5ETQ",
        "name": "Person"
    },
    "programStages":
    [
        {
            "id": "A03MvHHogjR",
        },
        {
            "id": "ZzYYXq4fJie",
        },
        {
            "id": "A01MvHHogjR",
        },
        {
            "id": "ZzGYXq4fJie",
        }
    ]
}
]
}

对。你应该没事的。装箱表示数据的数据结构:

public class Container
{
    public List<ProgramInfo> programs {get;set;}
}

public class ProgramInfo
{
   public string id{get; set;}
   public DateTime created{get;set;}
   public TrackEntity trrack{get;set;}
}

public class TrackEntity
{
    public string id{get;set;}
    public string name{get;set;}
}


//Then call the deserialise or serialize
Container container = new JavaScriptSerializer().Deserialize<Container>(yourString);
公共类容器
{
公共列表程序{get;set;}
}
公共类程序信息
{
公共字符串id{get;set;}
已创建公共日期时间{get;set;}
公共跟踪实体trrack{get;set;}
}
公共类跟踪实体
{
公共字符串id{get;set;}
公共字符串名称{get;set;}
}
//然后调用反序列化或序列化
Container Container=newJavaScriptSerializer()。反序列化(yourString);
公共类跟踪属性
{
公共字符串id{get;set;}
公共字符串名称{get;set;}
}
公共课程阶段
{
公共字符串id{get;set;}
}
公共课程
{
公共字符串id{get;set;}
已创建公共字符串{get;set;}
公共TrackedEntity TrackedEntity{get;set;}
公共列表{get;set;}
}
公共类根对象
{
公共列表程序{get;set;}
}
//然后调用反序列化或序列化
var container=new JavaScriptSerializer()。反序列化(inputjson);

希望它对您有用。

一种方法就是为各种实体创建POJO

如果对
TrackEntity

class TrackedEntity {
    private final String id;
    private final String name;

    @JsonCreator
    TrackedEntity(
            @JsonProperty("id") final String id,
            @JsonProperty("name") final String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}
然后,以下内容可能适用于
ProgramStage

class ProgramStage {
    private final String id;

    @JsonCreator
    ProgramStage(@JsonProperty("id") final String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
}
Program
类稍微复杂一些,因为它必须解析som类型的分区日期。在本例中,我将Java8
ZoneDateTime
与自定义格式化程序一起使用。您还可以将JSR310模块用作

要使用整个方法,只需实例化一个
ObjectMapper
,然后使用
readValue
方法,如下所示:

final Programs programs = new ObjectMapper().readValue(json, Programs.class);

如果您要复制并粘贴一个答案,只需稍加修改,请作为注释,而不是新答案。这很好,尽管我想使用com.fasterxml.jackson.databind库。无论如何,我都可以使用它来修复外部程序实体,您也可以使用JsonNode来获取“程序”:
JsonNode节点=objectMapper.readTree(response.getRawContents());node=node.get(“程序”);TypeReference typeRef=新的TypeReference(){};列表程序=对象映射器。readValue(node.traverse(),typeRef)class Program {
    private static final DateTimeFormatter FORMATTER = 
            DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxx");
    private final ZonedDateTime created;
    private final String id;
    private final List<ProgramStage> programStages;
    private final TrackedEntity trackedEntity;

    @JsonCreator
    public static Program of(
            @JsonProperty("id") final String id,
            @JsonProperty("created") final String created,
            @JsonProperty("trackedEntity") final TrackedEntity trackedEntity,
            @JsonProperty("programStages") final List<ProgramStage> programStages) {

        return new Program(
                id, 
                ZonedDateTime.parse(created, FORMATTER), 
                trackedEntity, 
                programStages);
    }

    public Program(
            final String id,
            final ZonedDateTime created,
            final TrackedEntity trackedEntity,
            final List<ProgramStage> programStages) {
        this.id = id;
        this.created = created;
        this.trackedEntity = trackedEntity;
        this.programStages = programStages;
    }

    public ZonedDateTime getCreated() {
        return created;
    }

    public String getId() {
        return id;
    }

    public List<ProgramStage> getProgramStages() {
        return programStages;
    }

    public TrackedEntity getTrackedEntity() {
        return trackedEntity;
    }
}
class Programs {
    private final List<Program> programs;

    @JsonCreator
    Programs(@JsonProperty("programs") final List<Program> programs) {
        this.programs = programs;
    }

    public List<Program> getPrograms() {
        return programs;
    }
}
final Programs programs = new ObjectMapper().readValue(json, Programs.class);