【问题标题】:Grouping Json response with keys in java用java中的键对Json响应进行分组
【发布时间】:2020-05-20 23:53:57
【问题描述】:

我是 Java 开发的新手。我正在学习 json 解析。我得到了类似这样的 json 响应。

    "sizePrices": [
        {

            "cargoHandoverPrice": 0.00,
            "sizeCode": "S",
            "sizeNumber": 100
        },
        {
            "cargoHandoverPrice": 1.66,
            "sizeCode": "M",
            "sizeNumber": 110

        },   
        {

            "cargoHandoverPrice": 0.00,
            "sizeCode": "L",
            "sizeNumber": 120

        }
        ,   
        {

            "cargoHandoverPrice": 0.00,
            "sizeCode": "XL",
            "sizeNumber": 130

        },   
        {

            "cargoHandoverPrice": 0.00,
            "sizeCode": "XXL",
            "sizeNumber": 140

        },   
        {

            "cargoHandoverPrice": 1.66,
            "sizeCode": "XXXL",
            "sizeNumber": 150

        }
    ]

如果价格匹配,它应该给我 sizerange 如下所示

我想把这个 Json 解析成这样的东西。

    [
        {

            "cargoHandoverPrice": 0.00,
            "SizeRange": "S-XXL",

        },
        {
            "cargoHandoverPrice": 1.66,
            "SizeRange": "M-XXXL",


        }
    ]

我怎样才能做到这一点?我的动机是根据价格对所有尺寸范围进行分组。

【问题讨论】:

    标签: java arrays json


    【解决方案1】:

    你真的在这里问了两个问题: 1. 如何将 JSON 解析为 Java 对象,然后再转换回 JSON 2.一旦我有Java对象中的数据,我如何按价格分组

    关于问题 1,有几个质量很好的 JSON 解析器可用,例如 https://github.com/google/gson 解析 JSON 并构造适当的对象相当简单。但是,如果您阅读了教程,尝试使用解析器然后遇到问题,请返回 SO 并提出具体问题。

    关于问题 2,这里有一个建议:

    enum Size { S, M, L, XL, XXL, XXL }
    
    class SizePrice {
        private final double price;
        private final Size size;
        private final int number;
    }
    
    List<SizePrice> sizePrices = <read from JSON>
    
    Map<Double,List<SizePrice>> sizePricesGroupedByPrice = sizePrices.stream()
        .collect(Collectors.groupingBy(sp -> sp.price));
    

    Size 枚举是故意按大小顺序排列的,因此您可以获得最小和最大(通过 ordinal())大小正在生成范围。

    【讨论】:

    • 但是我需要使用 Jackson 来解析这些 JSON,我可以有一个示例代码,我可以使用 jackson 来解析我的 json 并获取 o/p
    • 是的,这很好,但至少我从未使用过任何链接来获取参考。
    • 你可以尝试下面的 sn-p 来解析 - List&lt;Item&gt; items = objectMapper.convertValue(objectMapper.readTree(json).get("sizePrices"), new TypeReference&lt;List&lt;Item&gt;&gt;(){}); 其中 Item 是 @sprinter 提到的 SizePrice
    • 非常感谢在执行时我遇到了异常。 `线程“main”中的异常 java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonView at com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector. 我添加了这样的依赖项 com.fasterxml.jackson.corejackson-databind2.8.0
    • 嗨@sprinter,我添加了下面的代码来获取sizeprices列表并且我正在获取值。` List items = mapper.convertValue(mapper.readTree(json).get( "sizePrices"), new TypeReference>() { });` 而且我也可以分组。现在我得到了大小为 2 的列表,以后我怎样才能得到这些范围?
    猜你喜欢
    • 2017-01-05
    • 2019-03-20
    • 2018-07-05
    • 2014-11-15
    • 1970-01-01
    • 2015-05-06
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多