0

我有一个来自以下调用的 JSON 数据数组:

guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [Any] else {
print("Not containing JSON")
return
}

当我运行 print(json) 时,我在输出中得到以下信息:

[{
"CREATED_BY" = "DOMAIN\\USER";
"CREATED_DATE" = "2016-11-28T08:43:59";
STATUS = U;
"WIDGET_NUMBER" = K11;
"UPDATED_BY" = "<null>";
"UPDATED_DATE" = "<null>";
}, {
"CREATED_BY" = "DOMAIN\\USER";
"CREATED_DATE" = "2016-05-09T08:46:23";
STATUS = U;
"WIDGET_NUMBER" = 89704;
"UPDATED_BY" = "<null>";
"UPDATED_DATE" = "<null>";
}]

我正在尝试获取 JSON 数据数组中的所有 WIDGETNUMBER 值。json 变量是 Any 类型,到目前为止我还无法转换为结构。有没有一种简单的方法可以从 JSON 对象中获取元素?

4

4 回答 4

2

看起来你有一系列字典

for item in json {
    if let item = item as? [String: Any],  let widgetNo = item["WIDGET_NUMBER"] {
        print(widgetNo)
    }
}
于 2018-08-09T16:56:56.270 回答
0

您的内容是 Dictionary 数组,因此您必须将每个元素 Dictionary 转换为 Json

for dic in content {
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)
        print(jsonData)
    } catch {
        print(error.localizedDescription)
    }
}

或者您可以直接从 Dictionary读取WIDGET_NUMBER的值

for dic in content {
    print(dic["WIDGET_NUMBER"] ?? "Not found")
}
于 2018-08-09T17:23:07.527 回答
0

Joakim 的答案是获取小部件编号。对于您的结构,请务必添加类似这样的内容作为初始化程序来映射您的对象。

let widgetNumber: Int
let user: String

    init?(json:[String:Any]) {

      guard let widgetNumber = json["WIDGET_NUMBER"] as? Int, 
            let user = json["CREATED_BY"] as? String else { return nil }

    self.widgetNumber = widgetNumber
    self.user = user

    }
于 2018-08-09T20:26:34.007 回答
0

如果您只想要一个小部件编号数组,您可以使用reduce迭代数组中的字典并提取小部件编号的函数:

使用您的数据,我将其放入故事板中:

let json = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as! [[String: Any]]

let widgetNumbers = json?.reduce(into: [String]()){ (accum, dict) in
    guard let widget = dict["WIDGET_NUMBER"] as? String else { return }
    accum.append(widget)
}

widgetNumbers // -> ["K11", "89704"]
于 2018-08-09T21:55:54.960 回答