SwiftyJSearch
SwiftyJSearch 扩展了 SwiftyJSON 的 JSON 搜索功能。
SwiftyJSON
此软件包扩展了 Swift JSON 处理包 SwiftyJSON 的使用。
在此处查看项目:SwiftyJSON
对 SwiftyJSON 源代码所做的更改列在 SwiftyJSON 变更 中
要求
- iOS 13.0+, macOS 10.13+
- Xcode 14
警告
此包尚未完成,目前正在开发中,版本将会有变化,当前使用可能产生未知结果。
集成
Swift Package Manager
您可以使用Swift Package Manager通过在您的Package.swift
文件中添加适当的描述来安装SwiftyJSearch
。
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
dependencies: [
.package(url: "https://github.com/seanericksonpl12/SwiftyJSearch.git", branch: "main"),
]
)
准备好后运行swift build
。
用法
SwiftyJSON 扩展
SwiftyJSON 初始化
import SwiftyJSearch
let json = JSON(data: someData)
有关所有 JSON 对象使用信息,请查阅 SwiftyJSON 文档
树形格式
大型的 JSON 数据难以阅读,尤其是深层嵌套时。SwiftyJSearch 通过 treeFormat 变量使阅读 JSON 变得更容易。
示例 JSON
[
{
"car types": [
{
"brand": "Chevy",
"gasoline": true,
"models": [
"Camaro",
"Corvette",
"Silverado",
"Suburban"
]
},
{
"my own car": {
"miles": 91242,
"gasoline": true,
"parts" : [
"steering wheel",
"brake pads",
"chassis"
]
}
}
]
}
]
let json = JSON(data: jsonDataFromAbove)
print(json.treeFormat)
// output:
└── car types
├── #
│ ├── models
│ │ ├── Camaro
│ │ ├── Corvette
│ │ ├── Silverado
│ │ └── Suburban
│ ├── gasoline
│ │ └── true
│ └── brand
│ └── Chevy
└── my own car
└── #
├── miles
│ └── 91242
├── gasoline
│ └── true
└── parts
├── steering wheel
├── brake pads
└── chassis
为了提高可读性,'#' 节点代表具有多个键的字典
由于 JSON 字典是无序的,字典中键对的顺序可能会变化
广度优先搜索
let json = JSON(data: jsonDataFromAbove)
let values = json.bfs(for: "my own car")
print(values.first!.treeFormat)
// output:
#
├── parts
│ ├── steering wheel
│ ├── brake pads
│ └── chassis
├── miles
│ └── 91242
└── gasoline
└── true
或通过一次搜索查找多个键
let json = JSON(data: jsonDataFromAbove)
let valueDictionary = json.bfs(for: ["models", "parts"])
if let parts = valueDictionary["parts"]?.first, let models = valueDictionary["models"]?.first {
print(models.treeFormat)
print(parts.treeFormat)
}
// output:
├── Camaro
├── Corvette
├── Silverado
└── Suburban
├── steering wheel
├── brake pads
└── chassis
JSONTree
对于存储和操作 JSON 数据的另一种方式,可以使用 JSONTree 结构。JSONTree 是一个基本的树形数据结构,但其构建围绕存储 JSON 数据。
初始化
let json = JSON(data: jsonDataFromAbove)
let tree = JSONTree(json: json)
或者自行构建
let root = JSONTree.Node(children: [], content: .string("root"))
let tree = JSONTree(root: root)
内容类型
JSONTree节点使用ContentType
枚举存储值。
ContentType values:
.string(String)
.number(NSNumber)
.bool(Bool)
.null
美化格式
JSONTree的beautifulFormat与JSON treeFormat的工作方式相同
let json = JSON(data: jsonDataFromAbove)
let tree = JSONTree(json: json)
print(tree.prettyFormat)
// output:
└── car types
├── #
│ ├── models
│ │ ├── Camaro
│ │ ├── Corvette
│ │ ├── Silverado
│ │ └── Suburban
│ ├── gasoline
│ │ └── true
│ └── brand
│ └── Chevy
└── my own car
└── #
├── miles
│ └── 91242
├── gasoline
│ └── true
└── parts
├── steering wheel
├── brake pads
└── chassis
JSONTree通过在初始化时对无序字典进行排序来自动平衡,以提高搜索速度,因此json.treeFormat和tree.prettyFormat之间的输出可能不同
搜索
在树中搜索任何数据,类似于具有json对象的广度优先搜索,并获取包含该数据的树节点引用
let json = JSON(data: jsonDataFromAbove)
let tree = JSONTree(json: json)
let node = tree.search(for: "chassis")
node?.content = .string("radio")
print(tree.prettyFormat)
// output:
...
└── my own car
└── #
├── miles
│ └── 91242
├── gasoline
│ └── true
└── parts
├── steering wheel
├── brake pads
└── radio
修改
通过添加新的子节点到节点或使用提供的函数删除节点来自行修改json
let json = JSON(data: jsonDataFromAbove)
let tree = JSONTree(json: json)
tree.removeAll(where: { $0.content == .string("parts") || $0.content == .number(91242)})
print(tree.prettyFormat)
// output:
...
└── my own car
└── #
├── miles
├── gasoline
│ └── true
├── steering wheel
├── brake pads
└── chassis
SwiftyJSON变更
由于SwiftyJSON项目近年来缺乏更新,此包包含SwiftyJSON的源代码,并提供更新后的iOS/MacOS版本支持,而不是将其作为依赖项链接。以下是所有对原始SwiftyJSON代码所做的更改。
以下未列出的所有其他功能与原始项目的README保持一致。
Int8
Int8似乎不再适用于构造NSNumber(参见NSNumber)。因此,已从JSON变量中删除int8
和int8Value
。 uInt8
仍然有效且可用。
元数据
SwiftyJSON - SwiftyJSON SwiftyJSON作者 - lingoer、wongzigii、Luke Tang
SwiftyJSearch作者 - Sean Erickson [email protected]