测试已测试 | ✓ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年10月 |
SwiftSwift版本 | 4.0 |
SPM支持SPM | ✗ |
由Oliver Borchert维护。
依赖 | |
CorePromises | >= 0 |
Alamofire | >= 0 |
CoreUtility | >= 0 |
WebParsing是完全用Swift编写的框架,用于以非常高级的抽象级别处理JSON和XML。
完整文档可以在下载时在docs/index.html
中找到,或在线此处找到。该文档使用jazzy自动生成。
在最后的提交中,移除了对CoreUtility
的依赖。
WebParsing现在可在CocoaPods上使用!只需在您的Podfile中包含'WebParsing'
即可。
可以使用几种初始化方式初始化JSON
// Reading JSON from URLs
let url: URL = // some URL
let json = WPJson(readingFrom: url)
// Reading JSON from data
let data: Data = // some data
let json = WPJson(reading: data)
// Reading JSON from string
let jsonString: String = // some string
let json = WPJson(reading: jsonString)
假设,我们有一个如下所示的文件作为数据:
{
"people": [
{
"prename": "John",
"surname": "Smith",
"age": 45,
"gender": "male"
}
]
}
读取它变得非常简单
let json = WPJson(reading: data)
print(json["people"][0]["prename"].string) // prints 'John'
但实际上,使用WPEncodable
协议可以做得更加简单。一个封装人的结构体可能如下所示:
struct Person: WPEncodable {
let prename: String
let surname: String
let gender: String
let age: Int
init(coder decoder: WPDecoder) {
prename = decoder.decode(forKey: "prename")
surname = decoder.decode(forKey: "surname")
gender = decoder.decode(forKey: "gender")
age = decoder.decode(forKey: "age")
}
func encode(with encoder: WPEncoder) {
encoder.encode(prename, forKey: "prename")
encoder.encode(surname, forKey: "surname")
encoder.encode(gender, forKey: "gender")
encoder.encode(age, forKey: "age")
}
}
从上一个代码片段中的json
提取值会更加简单。
let people: [Person] = WPJsonDecoder.decode(json["people"])
let john = people[0]
print(john.prename) // prints 'John'
但如果我们从API接收的JSON突然变成了XML,并且现在返回如下文件呢?(省略了头部部分)
<root>
<people gender="male">
<prename>John</prename>
<surname>Smith</surname>
<age>45</age>
</people>
</root>
当我们得到xml文件为xmlData
时,我们几乎可以像之前一样做。
let xml = WPXml(reading: xmlData, infersTypes: true)
默认情况下infersTypes
参数为true:在XML中,年龄通常被解释为String,但是通过这个选项可以使解析器将其解释为数字。
接下来我们注意到:我们不再有数组了。实际上,在内部也没有存储数组。但是我们应该能够使用相同的代码来处理数组中的1个对象,以及多个对象。实际上,索引0可以始终访问,因为XML解析器无法从语义上知道它应该是一个数组。
因此,读取姓氏非常简单
print(xml["people"][0]["prename"].string) // prints 'John'
我们还可以使用几乎相同的Person类:我们只需将
// encoder.encode(gender, forKey: "gender") by
encoder.encodeAttribute(gender, forKey: "gender")
// and gender = decoder.decode(forKey: "gender") by
gender = decoder.decodeAttribute(forKey: "gender")
然后我们可以使用
let people: [Person] = WPXmlDecoder.decode(xml["people"])
let john = people[0]
print(john.gender) // prints 'male'