Java 解析同时包含对象和单个值的嵌套JSON
我相信这就是所谓的嵌套JSON,我想使用Jackson将其反序列化为对象。如果一个程序类有TrackedEntity和ProgramStage类型的示例对象(参见JSON代码),是否也可以将子对象自动解析为Java对象?或者,是否可以简单地解析各个对象的“id”,并将它们放入程序对象中的字符串中 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",
{
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类型的分区日期。在本例中,我将Java8ZoneDateTime
与自定义格式化程序一起使用。您还可以将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)我的问题有一部分没有得到回答,也许是不清楚;如果我只想在程序中有一个字符串成员,而不是整个TrackedEntity对象,该怎么办。是否可以解析TrackedEntity内部JSON对象的id并将其放入程序的成员字符串中(我们称之为trackedEntityId)?@simernes,这可以通过使用自定义或
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);