【问题标题】:How can i add specific JSON value to another array in Swift?如何将特定的 JSON 值添加到 Swift 中的另一个数组?
【发布时间】:2020-12-28 13:41:19
【问题描述】:

我是 IOS 编程新手。 我有一个用下面的代码描述的 json 数组。

let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? 
     NSDictionary
print("json: \(String(describing: json))")

代码的输出是;

json: Optional({
vendors =     (
            {
        firm = "XXX firm";
        id = 1;
        "show_firm" = 1;
    },
            {
        firm = "ZZZZZ firm";
        id = 2;
        "show_firm" = 1;
    }
  );
})

我只想将公司值添加到另一个数组中,例如公司 = ["XXX 公司" , "ZZZZZ 公司"]

我该怎么做?

任何帮助将不胜感激。

@witek bobrowski 询问 String(data: data!, encoding: .utf8) 输出。这个输出也在下面。顺便说一句,json数据来自服务器作为http post响应。

json2: Optional("{\"vendors\":[{\"id\":\"1\",\"firm\":\"XXX firm\",\"show_firm\":\"1\"},{\"id\":\"2\",\"firm\":\"ZZZZZ firm\",\"show_firm\":\"1\"}]}")

【问题讨论】:

  • 您能否尝试打印String(data: data!, encoding: .utf8) 而不是您当前的打印声明?

标签: arrays json swift xcode


【解决方案1】:

我认为最好的方法是解码 JSON,然后将公司值添加到数组中。

struct model: Decodable{
   var vendors: [decodingModel]
}

struct decodingModel: Decodable{
    var firm: String
    var id: Int
    var show_firm: Int
}

let decoder = JSONDecoder()
do{
    let result = try decoder.decode(model.self, from: jsonData)
    let firmsArray = result.vendors.compactMap({$0.firm})
}catch{
    print(error)
}

由于您尚未发布您的子结构,我只能假设您有一个 Json,其中 vendor 是一个 json 数组。 firmsArray 是您正在寻找的。 如果这不起作用可能是因为错误的modeldecodingModel。如果您发布您的json结构,我将更新代码,以便您可以正确解码您的json

【讨论】:

    【解决方案2】:

    最好的方法是为您的 json 创建可解码模型,如下所示:

    struct Firm: Decodable {
        let id: Int
        let name: String
        let showFirm: Int
        
        enum CodingKeys: String, CodingKey {
            case id
            case name = "firm"
            case showFirm = "show_firm"
        }
    }
    

    我创建了这个工厂方法来根据您在问题中提供的内容在本地模拟您的 json 响应

    struct FirmFactory {
        static func makeFirms() -> [Firm]? {
            let json = [
                [
                    "firm": "XXX firm",
                    "id": 1,
                    "show_firm": 1,
                ],
                [
                    "firm": "ZZZZZ firm",
                    "id": 2,
                    "show_firm": 1,
                ],
            ]
    
            // you should use the following code to decode and parse your real json response 
            do {
                let data = try JSONSerialization.data(
                    withJSONObject: json,
                    options: .prettyPrinted
                )
                
                return try JSONDecoder().decode([Firm].self, from: data)
            } catch {
                print("error \(error.localizedDescription)")
                return nil
            }
        }
    }
    

    现在您将能够根据您的要求仅映射公司名称,您可以像这样进行测试

     let firmNames = FirmFactory.makeFirms()?.map { $0.name }
     print("firmNames \(firmNames)")
    

    【讨论】:

      【解决方案3】:

      我再次回答了我自己的问题。给出了 2 个答案,但我没有在我的代码中使用任何这些。可能这两个答案是可用的,但由于我是 IOS 的新手,我无法使用它们中的任何一个。在漫长的谷歌搜索结束时,我解决了我的问题,如下所示。

      let vendors = json!["vendors"]! as! [[String : AnyObject]]
                      
                      for firm in vendors {
                          let firm1 = firm["firm"]! as! String
                          self.providerArray.append(firm1)
                         
                      }
      

      我希望这个答案能解决像我这样的其他人的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 2019-04-30
        • 1970-01-01
        • 2015-09-26
        相关资源
        最近更新 更多