Nas*_*296 21 xcode parsing json swift
有没有人能够找到一种方法来解析Swift 3中的JSON文件?我已经能够返回数据但是在将数据分解为特定字段时我没有成功.我会发布示例代码,但我已经通过这么多不同的方法失败了,并没有保存任何.我要解析的基本格式是这样的.提前致谢.
{
"Language": {
"Field":[
{
"Number":"976",
"Name":"Test"
},
{
"Number":"977",
"Name":"Test"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
Jef*_*mas 27
你试过JSONSerialization.jsonObject(with:options:)吗?
var jsonString = "{" +
"\"Language\": {" +
"\"Field\":[" +
"{" +
"\"Number\":\"976\"," +
"\"Name\":\"Test\"" +
"}," +
"{" +
"\"Number\":\"977\"," +
"\"Name\":\"Test\"" +
"}" +
"]" +
"}" +
"}"
var data = jsonString.data(using: .utf8)!
let json = try? JSONSerialization.jsonObject(with: data)
Run Code Online (Sandbox Code Playgroud)
Swift有时会产生一些非常奇怪的语法.
if let number = json?["Language"]??["Field"]??[0]?["Number"] as? String {
print(number)
}
Run Code Online (Sandbox Code Playgroud)
JSON对象层次结构中的所有内容最终都被包装为可选(即.AnyObject?).Array<T>下标返回非可选T.对于这个包含在可选的数组下标中的JSON,返回Optional<AnyObject>.但是,Dictionary<K, V>下标返回一个Optional<V>.对于这个JSON,下标返回非常奇怪的外观
Optional<Optional<AnyObject>>(即.AnyObject??).
json是一个Optional<AnyObject>.json?["Language"]返回一个Optional<Optional<AnyObject>>.json?["Language"]??["Field"]返回一个Optional<Optional<AnyObject>>.json?["Language"]??["Field"]??[0]返回一个Optional<AnyObject>.json?["Language"]??["Field"]??[0]?["Number"]返回一个Optional<Optional<AnyObject>>.json?["Language"]??["Field"]??[0]?["Number"] as? String返回一个Optional<String>.的Optional<String>,然后由使用if let语法产物String.
最后注意:迭代字段数组看起来像这样.
for field in json?["Language"]??["Field"] as? [AnyObject] ?? [] {
if let number = field["Number"] as? String {
print(number)
}
}
Run Code Online (Sandbox Code Playgroud)
Swift 4更新
Swift 4使这一切变得更容易处理.我们将再次从您的测试数据开始("""使这更好).
let data = """
{
"Language": {
"Field":[
{
"Number":"976",
"Name":"Test"
},
{
"Number":"977",
"Name":"Test"
}
]
}
}
""".data(using: .utf8)!
Run Code Online (Sandbox Code Playgroud)
接下来,我们可以定义JSON中使用的对象的类.
struct Object: Decodable {
let language: Language
enum CodingKeys: String, CodingKey { case language="Language" }
}
struct Language: Decodable {
let fields: [Field]
enum CodingKeys: String, CodingKey { case fields="Field" }
}
struct Field: Decodable {
let number: String
let name: String
enum CodingKeys: String, CodingKey { case number="Number"; case name="Name" }
}
Run Code Online (Sandbox Code Playgroud)
该CodingKeys枚举是属性如何结构被映射到JSON对象构件字符串.此映射由自动完成Decodable.
现在解析JSON很简单.
let object = try! JSONDecoder().decode(Object.self, from: data)
print(object.language.fields[0].name)
for field in object.language.fields {
print(field.number)
}
Run Code Online (Sandbox Code Playgroud)
ser*_*zhd 13
在Xcode 8和Swift 3中, id现在导入Any而不是AnyObject
这意味着JSONSerialization.jsonObject(with: data)退货Any.所以你必须将json data转换为特定的类型[String:Any].同样适用于json下面的下一个字段.
var jsonString = "{" +
"\"Language\": {" +
"\"Field\":[" +
"{" +
"\"Number\":\"976\"," +
"\"Name\":\"Test1\"" +
"}," +
"{" +
"\"Number\":\"977\"," +
"\"Name\":\"Test2\"" +
"}" +
"]" +
"}" +
"}"
var data = jsonString.data(using: .utf8)!
if let parsedData = try? JSONSerialization.jsonObject(with: data) as! [String:Any] {
let language = parsedData["Language"] as! [String:Any]
print(language)
let field = language["Field"] as! [[String:Any]]
let name = field[0]["Name"]!
print(name) // ==> Test1
}
Run Code Online (Sandbox Code Playgroud)
在实践中,你可能想要一些特定的字段埋在json中.让我们假设它Name是Field数组的第一个元素的字段.您可以使用这样的unwraps链来安全地访问该字段:
var data = jsonString.data(using: .utf8)!
if let json = try? JSONSerialization.jsonObject(with: data) as? [String:Any],
let language = json?["Language"] as? [String:Any],
let field = language["Field"] as? [[String:Any]],
let name = field[0]["Name"] as? String, field.count > 0 {
print(name) // ==> Test1
} else {
print("bad json - do some recovery")
}
Run Code Online (Sandbox Code Playgroud)
您也可以查看Apple的Swift博客在Swift中使用JSON
| 归档时间: |
|
| 查看次数: |
52756 次 |
| 最近记录: |