使用 Swift 4 解析 JSON 数据数组

Jac*_*obi 2 json nsjsonserialization swift

我正在使用以下代码。仅当 JSON 数据不以“[”字符开头时,它才有效。它适用于以“{”字符开头的 JSON 数据。这里有一个类似的问题:Parsing JSON array in swift但大多数方法已被弃用,我无法让代码工作。这是我正在使用的 JSON 调用:

guard let json = (try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [String: Any]        else {
    print("Error: Could not parse JSON!!!")
    return
}
Run Code Online (Sandbox Code Playgroud)

我尝试删除所有选项并使用allowFragments 和 mutableLeaves 等。据我了解, mutableContainers 是默认设置,但我一直在尽我所能。任何帮助或建议将不胜感激。

以下是我正在使用的 JSON 数据的示例:

{ "CREATED_BY" = "域\用户"; "CREATED_DATE" = "2011-09-30T15:00:13"; 状态=U;“EMPLOYEE_NUMBER”= 039000292;"UPDATED_BY" = "域\用户""; "UPDATED_DATE" = "2014-08-02T13:22:01"; }

jlo*_*owe 5

问题是 [] 表示 json 是一个对象数组,因此您需要将其转换为数组。您可以通过将其转换为 [Any] 或将其转换为字典数组(这就是它的真正含义)来完成此操作。

do {
    let json = try JSONSerialization.jsonObject(with: data, options: []) as? [Any]
    let json2 = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] 
} catch {
    print("Error: Couldn't parse JSON. \(error.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)

因此,向上述块提供以下 json:

let jsonString = """
    [{
        "id": "5",
        "name": "Test",
        "team1": "thingy team",
        "team2": "clicky team",
        "category": "4",
        "end_date": "1415217600",
        "cat_name": "new thingy",
        "team1_bets": 1,
        "team2_bets": 1
    }]
"""
Run Code Online (Sandbox Code Playgroud)

你最终会得到以下输出:

let json = Optional([{
    "cat_name" = "new thingy";
    category = 4;
    "end_date" = 1415217600;
    id = 5;
    name = Test;
    team1 = "thingy team";
    "team1_bets" = 1;
    team2 = "clicky team";
    "team2_bets" = 1;
}])
let json2 = Optional([["team2_bets": 1, "name": Test, "id": 5, "team1_bets": 1, "team2": clicky team, "team1": thingy team, "category": 4, "cat_name": new thingy, "end_date": 1415217600]])
Run Code Online (Sandbox Code Playgroud)

两者之间的主要区别在于,其内容json是对象数组Any,然后需要将其转换为您正在使用的任何数据类型。该json2数组是一个字典数组,然后您需要转换Any对象,但仍然拥有可用的键。