迅速从JSON

时间:2018-09-20 06:43:38

标签: ios json swift

我的场景我在视图中有四个标签,我需要获取标记值的结果并分配给该标签。如果我在数组中仅收到一个索引,则需要调用其他函数。我正在使用旧的方法JSON不可编码和第三方库。请提供一些解决方案。

下面,我的答复

{
    "status": 1,
    "status_code": 200,
    "result": [
        "100 marks",
        "30 marks",
        "40 marks",
        "70 marks"
    ]
}

下面我正在使用的代码

if (status_code != 200) {
    print("ERROR:\(String(describing: status_code))")
} else {
    let results = result["result"]  as? String
    print("Marks:\(results ?? "")")

    // Call confirmation alert
    DispatchQueue.main.async {
        self.one_label.text! = ""
        self.two_label.text! = ""
        self.three_label.text! = ""
        self.four_label.text! = ""
    }
}

3 个答案:

答案 0 :(得分:1)

您的代码不正确的部分是:您试图将result["result"]强制转换为单数String,事实并非如此!它是字符串的 array 。因此,您应该做的是:

if let results = result["result"]  as? [String] {
    print(results[0]) // first mark in the array (100 marks)
}

此外:

在这一点上,我建议采用模板化数据的方法,而不要处理字典。由于拥有有效的Json,因此您可以使用Docadable协议轻松实现它,例如:

let json = """
{
"status": 1,
"status_code": 200,
"result": [
"100 marks",
"30 marks",
"40 marks",
"70 marks"
]
}
""".data(using: .utf8)

struct Result: Decodable {
    var status: Int
    var statusCode: Int
    var result: [String]

    enum CodingKeys: String, CodingKey {
        case status
        case statusCode = "status_code"
        case result
    }
}

let decoder = JSONDecoder()
let resultObject = try decoder.decode(Result.self, from: json!)
print(resultObject)

答案 1 :(得分:0)

json中的结果是数组。因此,您需要将其转换为数组。

let results = result["result"]  as? [String]
        print("Marks:\(results ?? "")")

答案 2 :(得分:-1)

结果包含[String],所以请

替换

let results = result["result"]  as? String

   if let results = result["result"]  as? [String], results.count >= 4 {

    self.one_label.text! = results[0] ?? ""
    self.two_label.text! = results[1] ?? ""
    self.three_label.text! = results[2] ?? ""
    self.four_label.text! = results[3] ?? ""

    } else {
        // Call your function here
    }