WebParsing 3.2.2

WebParsing 3.2.2

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布2017年10月
SwiftSwift版本4.0
SPM支持SPM

Oliver Borchert维护。



 
依赖
CorePromises>= 0
Alamofire>= 0
CoreUtility>= 0
 

  • 作者
  • borchero

WebParsing是完全用Swift编写的框架,用于以非常高级的抽象级别处理JSON和XML。

文档

完整文档可以在下载时在docs/index.html中找到,或在线此处找到。该文档使用jazzy自动生成。

在最后的提交中,移除了对CoreUtility的依赖。

WebParsing现在可在CocoaPods上使用!只需在您的Podfile中包含'WebParsing'即可。

如何使用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'