【问题标题】:How to parse complex nested JSON in java?如何在java中解析复杂的嵌套JSON?
【发布时间】: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。他们可以实现你想要的

标签: java json jackson jsonserializer


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2017-05-21
    • 2019-06-11
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多