Swift 3 中的 JSON 解析 [英] JSON Parsing in Swift 3
问题描述
有没有人能够找到一种在 Swift 3 中解析 JSON 文件的方法?我已经能够让数据返回,但是在将数据分解为特定字段时我没有成功.我会发布示例代码,但我已经尝试了很多不同的方法但没有成功并且没有保存任何方法.我想解析的基本格式是这样的.提前致谢.
Has anyone been able to find a way to parse through JSON files in Swift 3? I have been able to get the data to return but I am unsuccessful when it comes to breaking the data down into specific fields. I would post sample code but I've gone through so many different methods unsuccessfully and haven't saved any. The basic format I want to parse through is something like this. Thanks in advance.
{
"Language": {
"Field":[
{
"Number":"976",
"Name":"Test"
},
{
"Number":"977",
"Name":"Test"
}
]
}
}
推荐答案
您是否尝试过 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)
<小时>
Swift 有时会产生一些非常奇怪的语法.
Swift sometimes produces some very odd syntax.
if let number = json?["Language"]??["Field"]??[0]?["Number"] as? String {
print(number)
}
JSON 对象层次结构中的所有内容最终都被包装为可选(即 AnyObject?
).Array
下标返回一个非可选的 T
.对于这个包裹在可选数组下标中的 JSON,返回 Optional
.但是,Dictionary
下标返回一个 Optional
.对于这个 JSON,下标返回看起来很奇怪的可选<可选
(即AnyObject??
).
Everything in the JSON object hierarchy ends up getting wrapped as an optional (ie. AnyObject?
). Array<T>
subscript returns a non-optional T
. For this JSON, which is wrapped in an optional, array subscript returns Optional<AnyObject>
. However, Dictionary<K, V>
subscript returns an Optional<V>
. For this JSON, subscript returns the very odd looking
Optional<Optional<AnyObject>>
(ie. AnyObject??
).
json
是一个Optional
.json?["Language"]
返回一个Optional
.> json?["Language"]??["Field"]
返回一个Optional
.> json?["Language"]??["Field"]??[0]
返回一个Optional
.json?["Language"]??["Field"]??[0]?["Number"]
返回一个Optional
代码>.> json?["Language"]??["Field"]??[0]?["Number"] as?String
返回一个Optional
.
json
is anOptional<AnyObject>
.json?["Language"]
returns anOptional<Optional<AnyObject>>
.json?["Language"]??["Field"]
returns anOptional<Optional<AnyObject>>
.json?["Language"]??["Field"]??[0]
returns anOptional<AnyObject>
.json?["Language"]??["Field"]??[0]?["Number"]
returns anOptional<Optional<AnyObject>>
.json?["Language"]??["Field"]??[0]?["Number"] as? String
returns anOptional<String>
.
Optional
然后由 if let
语法使用以产生 String
.
The Optional<String>
is then used by the if let
syntax to product a String
.
最后一点:迭代字段数组看起来像这样.
Final note: iterating the field array looks like this.
for field in json?["Language"]??["Field"] as? [AnyObject] ?? [] {
if let number = field["Number"] as? String {
print(number)
}
}
<小时>
Swift 4 更新
Swift 4 使这一切变得更容易处理.我们将再次从您的测试数据开始("""
让这变得更好).
Swift 4 makes this all much easier to deal with. Again we will start with your test data ("""
makes this so much nicer).
let data = """
{
"Language": {
"Field":[
{
"Number":"976",
"Name":"Test"
},
{
"Number":"977",
"Name":"Test"
}
]
}
}
""".data(using: .utf8)!
<小时>
接下来,我们可以围绕 JSON 中使用的对象定义类.
Next we can define classes around the objects used in your 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" }
}
CodingKeys
枚举是如何将结构属性映射到 JSON 对象成员字符串.此映射由 Decodable
自动完成.
The CodingKeys
enum is how struct properties are mapped to JSON object member strings. This mapping is done automagically by Decodable
.
现在解析 JSON 很简单.
Parsing the JSON now is simple.
let object = try! JSONDecoder().decode(Object.self, from: data)
print(object.language.fields[0].name)
for field in object.language.fields {
print(field.number)
}
这篇关于Swift 3 中的 JSON 解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!