【问题标题】:Group a list of json object by property inside the common Array in Java在Java中的公共数组中按属性对json对象列表进行分组
【发布时间】:2023-03-03 02:07:01
【问题描述】:

我想问是否可以将对象按其公共数组中的另一个对象分组。

这是 JSON 响应,我需要将 item 列表按 program id 分组。 我正在尝试将其放在 HashMap 上,但效果不佳。

{
"id": "",
"ordered_by": 64,
"order_details": [
    {
        "resource": "Product",
        "required_prescription": false,
        "item": {
            "id": 6,
            "name": "Synergistic Copper Gloves",
            "code": "51537661-C",
            "enabled": true,
            "generic_name": "Mediocre Steel Wallet",
            "price_cents": 200000
        },
        "program": {
            "id": 12,
            "name": "Synergistic Wooden Shoes",
            "provider": "Synergistic Rubber Coat",
            "discount_type": "fixed"
        }
    },
    {
        "resource": "Product",
        "required_prescription": true,
        "item": {
            "id": 7,
            "name": "Rustic Leather Table",
            "code": "74283131-P",
            "enabled": true,
            "generic_name": "Incredible Bronze Clock",
            "price_cents": 8994
        },
        "program": {
            "id": 12,
            "name": "Synergistic Wooden Shoes",
            "provider": "Synergistic Rubber Coat",
            "discount_type": "fixed"
        }
    },
    {
        "resource": "Product",
        "required_prescription": false,
        "item": {
            "id": 116,
            "name": "Ergonomic Marble Hat",
            "code": "98845056-A",
            "enabled": true,
            "generic_name": "Incredible Granite Lamp",
            "price_cents": 8267
        },
        "program": {
            "id": 10,
            "name": "Durable Rubber Bag",
            "provider": "Aerodynamic Steel Chair",
            "discount_type": "fixed"
        }
    }
]}

这应该是分组后的预期对象。该项目按程序 ID 12 和 10 分组。

[
  {
    "id": 12,
    "name": "Synergistic Wooden Shoes",
    "provider": "Synergistic Rubber Coat",
    "discount_type": "fixed",
    "item": [
      {
        "id": 6,
        "name": "Synergistic Copper Gloves",
        "code": "51537661-C",
        "enabled": true,
        "generic_name": "Mediocre Steel Wallet",
        "price_cents": 200000
      },
      {
        "id": 7,
        "name": "Rustic Leather Table",
        "code": "74283131-P",
        "enabled": true,
        "generic_name": "Incredible Bronze Clock",
        "price_cents": 8994
      }
    ]
  },
  {
    "id": 10,
    "name": "Durable Rubber Bag",
    "provider": "Aerodynamic Steel Chair",
    "discount_type": "fixed",
    "item": [
      {
        "id": 116,
        "name": "Ergonomic Marble Hat",
        "code": "98845056-A",
        "enabled": true,
        "generic_name": "Incredible Granite Lamp",
        "price_cents": 8267
      }
    ]
  }
]

所有 cmets 将不胜感激。提前致谢!

【问题讨论】:

    标签: java android arrays json list


    【解决方案1】:

    我已经获取了您的源 json 并尝试根据您的规范对其进行转换,这是有效的解决方案,将您的源 JSON 作为字符串传递,您将获得所需的输出

    private String parseJson(String source) {
        JSONArray result = new JSONArray();
        List<Integer> ids = new ArrayList<>();
        HashMap<Integer,JSONObject> programs = new HashMap<>();
        try {
            JSONObject jSource = new JSONObject(source);
            JSONArray orderDetails = jSource.getJSONArray("order_details");
            if (orderDetails.length() > 0) {
                for (int i = 0; i < orderDetails.length(); i++) {
                    JSONObject jsonObject = orderDetails.getJSONObject(i);
                    JSONObject item = jsonObject.getJSONObject("item");
                    JSONObject program = jsonObject.getJSONObject("program");
                    int programId = jsonObject.getJSONObject("program").getInt("id");
                    if (!ids.contains(programId)) {
                        ids.add(programId);
                        program.put("item",new JSONArray().put(item));
                        programs.put(programId,program);
                    }else{
                        program.put("item",programs.get(programId).getJSONArray("item").put(item));
                    }
                }
    
                for(int k :programs.keySet()){
                    result.put(programs.get(k));
                }
    
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return result.toString();
    }
    

    【讨论】:

    • 如果它适合你,那么请接受这个作为你的答案
    • 有效!非常感谢@trinadh!您是救生员,是否也可以将字符串转换为对象? TIA
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2015-12-31
    • 2021-08-18
    相关资源
    最近更新 更多