简介
OrderJSON 是手动解析 json 字符串, 使得字典 key 与 json key顺序一致。
主要功能
- 手动解析 json 字符串
- 返回有序字典
OrderedDictionary
背景
在使用系统自带的 json 字符串转字典方法JSONSerialization后,发现字典是无序的。但是有时候我又想知道 key 的顺序。
所以在 json -- swiftDo基础上,使得我们可以获取 json 的 key 顺序。
Tip: 苹果官方提供有序字典、有序集合开源项目,当我们关注顺序的时候可以引入使用
使用
比如这里我们想要获取某个路径下的 key 顺序
目标 json 字符串
{ "stringValue": "字符串", "intValue": 20, "doubleValue": 12.8, "boolValue": false, "objectValue": { "objectKey1": "value1", "objectKey2": 2, "objectKey3": { "key1": "value1", "key2":"value2" } }, "arrayValue1": [1, 2, 3], "arrayValue2": [{ "name": "小明", "age": 18 }], "emptyArray": [], "emptyObject": {}, "nullValue": null }
转换为 OrderJSON
let json = """ {"stringValue":"字符串","intValue":20,"doubleValue":12.8,"boolValue":false,"objectValue":{"objectKey1":"value1","objectKey2":2,"objectKey3":{"key":"value"}},"arrayValue1":[1,2,3],"arrayValue2":[{"name":"小明","age":18}],"emptyArray":[],"emptyObject":{},"nullValue":null} """ let jsonObject = try? JsonParser.parse(text: json)
获取根 key 顺序
转化路径为数组方法
private func transformStringToArray(_ string: String) -> [String] { if string.isEmpty { return [] } return string.components(separatedBy: ".") }
通过路径数组,就可以获取对应 key 下子 key 的顺序数组
let rootPath = "" let rootKeys = jsonObject.subKeysFor(keyPath: transformStringToArray(rootPath))
输出结果
(lldb) po rootKeys ▿ 10 elements - 0 : "stringValue" - 1 : "intValue" - 2 : "doubleValue" - 3 : "boolValue" - 4 : "objectValue" - 5 : "arrayValue1" - 6 : "arrayValue2" - 7 : "emptyArray" - 8 : "emptyObject" - 9 : "nullValue"
多层 key 使用.连接
比如objectKey3的子 key 顺序 ==》 path = "objectValue.objectKey3"
let multiPath = "objectValue.objectKey3" let multiPathPathKeys = jsonObject.subKeysFor(keyPath: transformStringToArray(multiPath)) // ["key1","key2"]
获取 OrderJSON 的有序字典方法
/// 获取 有序字典
/// - Returns: 返回有序字典,如果 json 为数组则返回 nil
public func orderedDictionary() -> OrderedDictionary<String, Any>?
/// 获取 Any 类型, 其中 object 类型返回 `OrderedDictionary`
/// - Returns: 返回 Any 类型。
public func any() -> Any参考文章
目前仅支持 Swift Package Manager 集成