如何在java中解析复杂的嵌套JSON?
Posted
技术标签:
【中文标题】如何在java中解析复杂的嵌套JSON?【英文标题】:How to parse complex nested JSON in java? 【发布时间】:2021-09-23 17:25:48 【问题描述】:我有一个复杂的嵌套 Json
它有一个类似这样的主体:
staus: "Success",
id: 1,
data: ['Movie':'kung fu panda','% viewed': 50.5,'Movie':'kung fu panda 2','% viewed':1.5],
metadata: 'filters':['Movie', 'Percentage Viewed'], 'params':'content':'Comedy', 'type': 'Movie'
我唯一关心的字段是数据,而元数据通常是一个更复杂/嵌套的字段。我试图将其映射到:
@JsonIgnoreProperties(ignoreUnknown = true)
class ResponseData
public Data[] data;
@JsonIgnoreProperties(ignoreUnknown = true)
class Data
public String Movie;
public double viewed;
我将 Jackson 视为一种选择,并编写自己的序列化程序并使用 JsonIgnore 丢弃元数据,但无法绕过它。
对如何做到这一点有什么建议吗?
【问题讨论】:
如果您的 JSON 与您的示例类似,只需提取您的 data 数组,首先找到[
和 ]
。然后解析内容。
您可能希望将变量命名为 movie
而不是 Movie
。
除了字段名,我看不出有什么问题。只需添加@JsonProperty("% viewed")
就可以了。
请注意,在 Java 中使用 List<Data>
比使用 Data[]
更常见,但 Jackson 会同时处理这两种情况。
除非是强制性的,否则不要自己做。使用 Gson、Moshi 或 Jackson。他们可以实现你想要的
【参考方案1】:
您可以使用jackson-utils
public class Foo
public static void main(String... args)
ResponseData responseData1 = new ResponseData(
1,
"Success",
new ResponseData.Data[]
new ResponseData.Data("kung fu panda", 50.5),
new ResponseData.Data("kung fu panda 2", 1.5) ,
new ResponseData.Metadata(
new HashSet<>(Arrays.asList("Movie", "Percentage Viewed")),
new ResponseData.Metadata.Params("Comedy", "Movie"))
);
String json = JacksonUtils.prettyPrint().writeValue(responseData1);
System.out.println(json);
ResponseData responseData2 = JacksonUtils.readValue(json, ResponseData.class);
class ResponseData
private int id;
private String status;
private Data[] data;
private Metadata metadata;
public ResponseData()
public ResponseData(int id, String status, Data[] data, Metadata metadata)
this.id = id;
this.status = status;
this.data = data;
this.metadata = metadata;
public static class Data
@JsonProperty("Movie")
private String movie;
@JsonProperty("% viewed")
private double viewedPercents;
public Data()
public Data(String movie, double viewedPercents)
this.movie = movie;
this.viewedPercents = viewedPercents;
public static class Metadata
private Set<String> filters;
private Params params;
public Metadata()
public Metadata(Set<String> filters, Params params)
this.filters = filters;
this.params = params;
public static class Params
private String content;
private String type;
public Params()
public Params(String content, String type)
this.content = content;
this.type = type;
控制台输出:
"id" : 1,
"status" : "Success",
"data" : [
"Movie" : "kung fu panda",
"% viewed" : 50.5
,
"Movie" : "kung fu panda 2",
"% viewed" : 1.5
],
"metadata" :
"filters" : [ "Movie", "Percentage Viewed" ],
"params" :
"content" : "Comedy",
"type" : "Movie"
P.S. 作为替代方案,还有另一个具有相同语法的 util gson-utils。
【讨论】:
以上是关于如何在java中解析复杂的嵌套JSON?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用java将复杂的动态嵌套json插入bigquery