【问题标题】:Grouping json objects if object contains duplicate name based on key?如果对象包含基于键的重复名称,则对 json 对象进行分组?
【发布时间】:2018-02-23 06:30:39
【问题描述】:

我们有如下的 json 对象数组:

[{
    "CompanyCode": "1",
    "MachineCode": null,
    "MachineName": null,
    "NoOfMeters": null,
    "ScheduleNo": "12028",
    "ScheduleDate": "17/2/2018 12:00:00 AM",
    "ScheduleUser": "sales",
    "CustomerCode": "0022100007",
    "DeliveryCode": "0",
    "SortOrder": "1",
    "JobRefNo": "",
    "CustomerName": "COLD STORAGE SUPERMARKETS ",
    "CustAddress1": "GIANT COMPLEX",
    "OutletName": "",
    "OutAddress1": "",
    "IsJobClosed": ""
}, {
    "CompanyCode": "1",
    "MachineCode": null,
    "MachineName": null,
    "NoOfMeters": null,
    "ScheduleNo": "12029",
    "ScheduleDate": "17/2/2018 12:00:00 AM",
    "ScheduleUser": "sales",
    "CustomerCode": "0022100008",
    "DeliveryCode": "0",
    "SortOrder": "1",
    "JobRefNo": "",
    "CustomerName": "COLD STORAGE WH - 21 TAMPINES ",
    "CustAddress1": "GIANT COMPLEX",
    "OutletName": "",
    "OutAddress1": "",
    "IsJobClosed": ""
}, {
    "CompanyCode": "1",
    "MachineCode": null,
    "MachineName": null,
    "NoOfMeters": null,
    "ScheduleNo": "12027",
    "ScheduleDate": "17/2/2018 12:00:00 AM",
    "ScheduleUser": "winapp",
    "CustomerCode": "0022100003",
    "DeliveryCode": "0",
    "SortOrder": "1",
    "JobRefNo": "",
    "CustomerName": "AVENZA PTE LTD ",
    "CustAddress1": "83 CLEMENCEAU AVE",
    "OutletName": "",
    "OutAddress1": "",
    "IsJobClosed": ""
}, {
    "CompanyCode": "1",
    "MachineCode": null,
    "MachineName": null,
    "NoOfMeters": null,
    "ScheduleNo": "12025",
    "ScheduleDate": "17/2/2018 12:00:00 AM",
    "ScheduleUser": "winapp",
    "CustomerCode": "0022100001",
    "DeliveryCode": "0",
    "SortOrder": "1",
    "JobRefNo": "",
    "CustomerName": "CASH ON DELIVERY (TO) ",
    "CustAddress1": "CASH ON DELIVERY",
    "OutletName": "",
    "OutAddress1": "",
    "IsJobClosed": ""
}, {
    "CompanyCode": "1",
    "MachineCode": null,
    "MachineName": null,
    "NoOfMeters": null,
    "ScheduleNo": "12026",
    "ScheduleDate": "17/2/2018 12:00:00 AM",
    "ScheduleUser": "winapp",
    "CustomerCode": "0022100002",
    "DeliveryCode": "0",
    "SortOrder": "1",
    "JobRefNo": "",
    "CustomerName": "DESPATCH - MT ",
    "CustAddress1": "DESPATCH",
    "OutletName": "",
    "OutAddress1": "",
    "IsJobClosed": ""
}]

我们希望根据 ScheduleUser 键类似部分对这个数组进行分组。

[
  "Sales":[
            {

            }
            {

            }

           ]
  "winapp":[
            {

                }
            {

                }

            {

            }

            ]
  ]

我们在swift 4中研究了分组Here

但是他们给出了字符串数组,我们不知道如何处理 json 值。 如果有任何其他方式,请给我们解决方案。我们已经提到了Link

我们无法理解这一点。

从本地获取值

if let path = Bundle.main.path(forResource: "salesorder", ofType: "json") {
        do {
            let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
            do{
                let json =  try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                let jsonDictionary =  json as? [[String:Any]]

                print(jsonDictionary!)

            }catch let error{
                print(error.localizedDescription)
            }
        } catch let error {
            print(error.localizedDescription)
        }
    } else {
        print("Invalid filename/path.")
    }

提前谢谢..

【问题讨论】:

  • 你是如何解析这个 json 的?
  • 我将此 json 作为文件添加到包路径中
  • 请贴出代码。我会建议您获取所有可能的ScheduleUser(作为数组),然后为每个ScheduleUser 值获取filter 数据。
  • @HarvantS.Choudhary 感谢您的回复,您可以添加一些示例代码或 ling 吗?
  • 我不擅长 swift 但一定会尝试。

标签: ios swift3 collections swift4


【解决方案1】:

更好

使用分组方式

if let path = Bundle.main.path(forResource: "salesorder", ofType: "json") {
        do {
            let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
            do{
                let json =  try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                if let jsonDictionary =  json as? [[String:Any]]{
                
                var grouped2 : [String:[[String:Any]]] = Dictionary(grouping: jsonDictionary, by: {$0["ScheduleUser"] as! String})
                debugPrint(grouped2)
                print(jsonDictionary)
                }
                
            }catch let error{
                print(error.localizedDescription)
            }
        } catch let error {
            print(error.localizedDescription)
        }
    } else {
        print("Invalid filename/path.")
    }

手动方式

if let path = Bundle.main.path(forResource: "salesorder", ofType: "json") {
            do {
                let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
                do{
                    let json =  try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                    if let jsonDictionary =  json as? [[String:Any]]{
                    
                        var grouped : [String:[[String:Any]]] = [:]
                        for dict in jsonDictionary {
                            let value = dict["ScheduleUser"] as! String
                            if(grouped[dict["ScheduleUser"] as! String] == nil){
                                grouped[value] = [dict]
                            }else{
                                grouped[value]?.append(dict)
                            }
                        }
                        debugPrint(grouped)
                    print(jsonDictionary)
                    }
                    
                }catch let error{
                    print(error.localizedDescription)
                }
            } catch let error {
                print(error.localizedDescription)
            }
        } else {
            print("Invalid filename/path.")
        }

日志

["winapp": [["MachineName": , "CustomerCode": 0022100003, “JobRefNo”:,“OutAddress1”:,“SortOrder”:1,“IsJobClos​​ed”:, "CustAddress1": 83 CLEMENCEAU AVE, "OutletName": , "MachineCode": , "ScheduleDate": 17/2/2018 12:00:00 AM, "CustomerName": AVENZA PTE LTD,“ScheduleNo”:12027,“NoOfMeters”:,“DeliveryCode”: 0, "ScheduleUser": winapp, "CompanyCode": 1], ["MachineName": , “客户代码”:0022100001,“JobRefNo”:,“OutAddress1”:, "SortOrder": 1, "IsJobClos​​ed": , "CustAddress1": 货到付款, "OutletName": , "MachineCode": , "ScheduleDate": 17/2/2018 12:00:00 AM,“CustomerName”:货到付款(TO),“ScheduleNo”: 12025,“NoOfMeters”:,“DeliveryCode”:0,“ScheduleUser”: winapp, "CompanyCode": 1], ["MachineName": , "CustomerCode": 0022100002,“JobRefNo”:,“OutAddress1”:,“SortOrder”:1, "IsJobClos​​ed": , "CustAddress1": DESPATCH, "OutletName": , "MachineCode": , "ScheduleDate": 17/2/2018 12:00:00 AM, “客户名称”:DESPATCH - MT,“ScheduleNo”:12026,“NoOfMeters”: , "DeliveryCode": 0, "ScheduleUser": winapp, "CompanyCode": 1]], “销售”:[[“机器名称”:,“客户代码”:0022100007, “JobRefNo”:,“OutAddress1”:,“SortOrder”:1,“IsJobClos​​ed”:, "CustAddress1": GIANT COMPLEX, "OutletName": , "MachineCode":, “ScheduleDate”:17/2/2018 12:00:00 AM,“CustomerName”:COLD STORAGE 超市,“ScheduleNo”:12028,“NoOfMeters”:, “DeliveryCode”:0,“ScheduleUser”:销售,“CompanyCode”:1], ["MachineName": , "CustomerCode": 0022100008, "JobRefNo": , “OutAddress1”:,“SortOrder”:1,“IsJobClos​​ed”:,“CustAddress1”: GIANT COMPLEX,“OutletName”:,“MachineCode”:,“ScheduleDate”: 17/2/2018 12:00:00 AM,“客户名称”:COLD STORAGE WH - 21 TAMPINES, “ScheduleNo”:12029,“NoOfMeters”:,“DeliveryCode”:0, “ScheduleUser”:销售,“CompanyCode”:1]]]

【讨论】:

    【解决方案2】:

    获取数组中所有可能的值 -

    let arr = your data...
    let posValues = arr.map { $0["ScheduleUser"] as? String }
    

    现在为过滤数据创建一个字典 -

    var newDict:[String:Any] = [:]
    
    for aValue in posValues {
    
        let filteredDicts = arr.filter({ ($0.["ScheduleUser"] == aValue)})
        newDict[aValue] = filteredDicts
    }
    

    【讨论】:

    • 我在 let posValues = arr.map { $0["ScheduleUser"] as 时遇到错误? String } 不能用“String”类型的索引为“[[String : Any]]”类型的值下标
    • 出现错误。固定答案。
    猜你喜欢
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2022-01-14
    • 2020-12-28
    • 2017-07-15
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多