循环一个 json 文件并填充一个数组 Swift

Posted

技术标签:

【中文标题】循环一个 json 文件并填充一个数组 Swift【英文标题】:Loop though a json file and fill in an array Swift 【发布时间】:2016-07-08 07:21:43 【问题描述】:

我正在尝试遍历 json 并将每个项目放入自己的数组中。我不知道如何通过 json 循环。虽然我已经成功地放置了一次 json 并填充了数组,但现在我需要将整个 json 放入受尊重的数组中。任何帮助将不胜感激

这是我得到的:

func parseCoupons(response : String)

    print("Starting to parse the file")
    let data = response.dataUsingEncoding(NSUTF8StringEncoding)
    var myJson : NSArray
    myJson = []

    do 
        myJson = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! NSArray
    
    catch 
        print("Error")
    

    for item in myJson.count 
        titleArray.append((myJson[item]as! NSDictionary)["name"] as! String)
        descriptionArray.append((myJson[item]as! NSDictionary)["description"] as! String)
        amountArray.append((myJson[item]as! NSDictionary)["amount"] as! Int)
        typeArray.append((myJson[item]as! NSDictionary)["type"] as! String)
        startDateArray.append((myJson[item]as! NSDictionary)["start_date"] as! String)
        endDateArray.append((myJson[item]as! NSDictionary)["end_date"] as! String)
        barcodeArray.append((myJson[item]as! NSDictionary)["barcode"] as! String)
    

而我要解析的Json会是这个样子

[
 
  "name": "Coupon Title",
  "description": "The Coupon Description",
  "type": "PERCENT_OFF",
  "amount": 15,
  "barcode": "4948473",
  "start_date": "2016-12-01",
  "end_date": "2016-12-25",

 ,

ECT ECT ECT

]

【问题讨论】:

【参考方案1】:

Swift 是一种面向对象的语言,所以创建一个自定义对象而不是使用一堆不相关的数组。

struct Coupon 

  var name : String
  var description : String
  var amount : Int
  var type : String
  var startDate : String
  var endDate : String
  var barcode : String


parseCoupons使用Swift原生集合类型时,该方法返回解析后的Coupon项:

func parseCoupons(response : String) -> [Coupon]

  print("Starting to parse the file")
  let data = Data(response.utf8)
  var coupons = [Coupon]()

  do 
    let myJson = try JSONSerialization.jsonObject(with: data) as! [[String:Any]]

    for item in myJson 
      let name = item["name"] as! String
      let description = item["description"] as! String
      let amount = item["amount"] as! Int
      let type = item["type"] as! String
      let startDate = item["start_date"] as! String
      let endDate = item ["end_date"] as! String
      let barcode = item["barcode"] as! String
      let coupon = Coupon(name: name,
                          description: description,
                          amount: amount,
                          type: type,
                          startDate: startDate,
                          endDate: endDate,
                          barcode: barcode)
      coupons.append(coupon)
    
   catch 
    print("Error", error)
  
  return coupons

旁注:您的do - catch 块毫无意义,good 代码必须在do 范围内,并且在重复循环中一次又一次地执行表达式myJson[item]as! NSDictionary) 效率非常低。

编辑

在 Swift 4 中,它变得更加方便。

采纳Decodable

struct Coupon : Decodable  ...

并享受协议的魔力

func parseCoupons(response : String) throws -> [Coupon]

  print("Starting to parse the file")
  let data = Data(response.utf8)

  let decoder = JSONDecoder()
  decoder.keyDecodingStrategy = .convertFromSnakeCase
  return try decoder.decode([Coupon].self, from: data)

【讨论】:

【参考方案2】:

而不是像这样创建多个 array 创建包含 Dictionary 的对象。

var arr : [NSDictionary] = [NSDictionary]()

现在像这样在这个数组中添加你的所有对象

for item in myJson.count 
    arr.append(myJson[item] as! NSDictionary)

现在你可以像这样使用这个数组的字典来访问每个元素

print((arr[0] as! NSDictionary)["name"] as! String)

希望这会对你有所帮助。

【讨论】:

这很好,但不完全是我需要的。我希望单独的数组将每个变量的数据分开,并且稍后我还将在代码的后面循环遍历每个数组。将它们分开有助于我保持它们的直线【参考方案3】:

我通过调整和使用它工作的代码让它工作。 for 循环结构非常重要,否则它将无法正常工作。

    for i in 0..<myJson.count
    
        titleArray.append((myJson[i]as! NSDictionary)["name"] as! String)
        descriptionArray.append((myJson[i]as! NSDictionary)["description"] as! String)
        amountArray.append((myJson[i]as! NSDictionary)["amount"] as! Int)
        typeArray.append((myJson[i]as! NSDictionary)["type"] as! String)
        startDateArray.append((myJson[i]as! NSDictionary)["start_date"] as! String)
        endDateArray.append((myJson[i]as! NSDictionary)["end_date"] as! String)
        barcodeArray.append((myJson[i]as! NSDictionary)["barcode"] as! String)
    

它与您的@Nirav 非常相似,所以感谢您引导我完成此操作

【讨论】:

以上是关于循环一个 json 文件并填充一个数组 Swift的主要内容,如果未能解决你的问题,请参考以下文章

Swift - JSON解码返回空数组

将 UNIX 时间从 json 导入(swift 结构)转换为日期作为字符串并填充表

swift:从本地 json 文件填充的 uitableview 在滚动时严重卡顿

ios swift 2如何用json数据填充uipickerview [重复]

Swift 4 - SwiftyJson 比较数组并合并找到的值

循环填充数组时的 Swift EXC_BAD_INSTRUCTION