Swift JSON响应将两个字段值追加到单个数组中

时间:2018-08-07 20:32:32

标签: ios json swift

我正在尝试验证students == null或可用的值,如果可用值,我需要将get gradestore grade放入表数据数组中,并且需要将subject null存储在表中JSON下面的相同数组For example: [10, null, 11]。如何在JSON响应中的单个数组中附加这样的内容。

    {  
   "students":[  
      {  
         "id":0,
         "subject":[  
            {  
               "grade":10
            }
         ]
      },
      {  
         "id":1,
         "subject":null
      },
      {  
         "id":2,
         "subject":[  
            {  
               "grade":11
            }
         ]
      }
   ]
}

Expected output: [10,null,11,......] //This array I am going to use Tableview cell

我要根据单元格中的nullnot null数组值进行验证。我可以使用var array = [String?]来接受null值,但是如何将两个不同的字段结果附加到同一数组中?

3 个答案:

答案 0 :(得分:1)

您应该查看“可编码”协议。

只需定义一个结构即可:

struct Student: Codable

您可以将其从JSON解码为这些对象。

例如参见:hackernoongrokswift

答案 1 :(得分:0)

这看起来很简单。最好的解决方案是可腐烂的。从网络或其他任何方式加载的有效负载将解析为结构。现在,您可以轻松进行任何操作。

设置:打开一个新项目。使用您提供的json有效负载添加“ payload.json”文件。 将以下内容添加到您的项目中。

import UIKit

struct StudentData: Decodable {
    var students: [Student]
}

struct Student: Decodable {
    var id: Int
    var subject: [Subject]?
}

struct Subject: Decodable {
    var grade: Int
}

class ViewController: UIViewController {

    var data: Data? {
        guard let path = Bundle(for: type(of: self)).path(forResource: "payload", ofType: "json") else { return nil }
        return try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        if let data = data {
            do {
                let studentData = try JSONDecoder().decode(StudentData.self, from: data)
                print(studentData)

               // manipulate the structure in any way you want

               let subjects: [Subject?] = studentData.students.map { $0.subject?.first }
               print(subjects)

               let nonNilValues = subjects.compactMap { $0 }
               print(subjects)

               // ... etc

            } catch let error {
                print(error.localizedDescription)
            }
        }
    }
}

很抱歉没有在操场上编码。太容易了。

答案 2 :(得分:0)

尝试一下

 let students = [["id": 0,"subject": [["grade": 10]]],
                    ["id": 0,"subject": nil],
                    ["id": 0,"subject": [["grade": 10]]]] as! [Dictionary<String,Any>]

 let array = students.map({(($0["subject"] as? [Any])?.first as? Dictionary<String,Int>)?["grade"]})
 print(array)