如何解析 java 中的复杂嵌套 JSON?

How to parse complex nested JSON in java?

我有一个复杂的嵌套Json

它有一个 body 类似于:

{
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'}}
}

我唯一关心的字段是数据,而元数据通常是一个更 complex/nested 的字段。我试图将其映射到:

@JsonIgnoreProperties(ignoreUnknown = true)
class ResponseData{
    public Data[] data;
    @JsonIgnoreProperties(ignoreUnknown = true)
    class Data{
        public String Movie;
        public double viewed;
    }
}

我正在考虑将 Jackson 作为一个选项并编写自己的序列化程序并使用 JsonIgnore 丢弃元数据但无法绕过它。

关于如何做到这一点有什么建议吗?

您可以使用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. 作为替代方案,还有另一个具有相同语法的实用程序 gson-utils