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>
下标返回非可选的T
.对于此JSON(包装在可选的数组下标中),返回Optional<AnyObject>
.但是,Dictionary<K, V>
下标返回Optional<V>
.对于此JSON,下标返回非常奇怪的外观
Optional<Optional<AnyObject>>
(即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<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>
.
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>
.
然后if let
语法使用Optional<String>
来生成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)
}
}
快速4更新
Swift 4 Update
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屋!