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
}
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)
转化路径为数组方法
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"]
/// 获取 有序字典
/// - Returns: 返回有序字典,如果 json 为数组则返回 nil
public func orderedDictionary() -> OrderedDictionary<String, Any>?
/// 获取 Any 类型, 其中 object 类型返回 `OrderedDictionary`
/// - Returns: 返回 Any 类型。
public func any() -> Any
参考文章
目前仅支持 Swift Package Manager 集成