我认为我称之为嵌套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",
}
]
}
]
}
答案 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);
希望它适合你。