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

时间:2015-02-13 14:55:05

标签: java arrays json jackson

我认为我称之为嵌套JSON,我想使用Jackson反序列化为对象。如果Program类具有TrackedEntity和ProgramStage类型的对象(请参阅JSON代码),是否可以自动将子对象解析为Java对象?或者,是否可以简单地解析相应对象的“id”并将它们放在Program对象的字符串中?

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",
        }
    ]
}
]
}

3 个答案:

答案 0 :(得分:1)

是。你应该没事。创建一个代表您数据的数据结构:

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);

答案 1 :(得分:1)

一种方法就是为各种实体创建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类的分区日期。我在本例中使用了Java 8 ZonedDateTime和自定义格式化程序。您还可以将JSR 310模块用作described in this answer

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;
    }
}

最后,要修复外部programs实体,可以使用以下内容:

class Programs {
    private final List<Program> programs;

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

    public List<Program> getPrograms() {
        return programs;
    }
}

要使用整个内容,只需实例化ObjectMapper并使用readValue方法,如下所示:

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

答案 2 :(得分:0)

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

public class ProgramStage
{
    public string id { get; set; }
}

public class Program
{
    public string id { get; set; }
    public string created { get; set; }
    public TrackedEntity trackedEntity { get; set; }
    public List<ProgramStage> programStages { get; set; }
}

public class RootObject
{
    public List<Program> programs { get; set; }
}

//Then call the deserialise or serialize
var container = new JavaScriptSerializer().Deserialize<RootObject>(inputjson);

希望它适合你。