使用Swift 4解析JSON数据数组

时间:2018-08-08 22:05:03

标签: json swift nsjsonserialization

我正在使用以下代码。仅当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
}

我尝试删除所有选项,并使用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“;}

2 个答案:

答案 0 :(得分:2)

问题在于[]表示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)")
}

因此在上述代码块中提供了以下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
    }]
"""

您最终将获得以下输出:

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]])

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

答案 1 :(得分:1)

那么它可能是一个数组

do {
    let json = try JSONSerialization.jsonObject(with: data) as? [Any] 
    print(json)
}
catch {
   print(error)
}
  

此[]表示数组----> [任何]

     

而此{}表示字典-----> [String:Any]