如何在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

FLinkFlink SQL 解析嵌套的 JSON 数据

如何以角度解析嵌套的json

如何将具有嵌套对象的复杂 json 文件映射到 java 对象?

在 Pig 中解析复杂的嵌套 JSON

在 C# 中解析嵌套的复杂 JSON 响应