SwiftyJSearch 1.0.0

SwiftyJSearch 1.0.0

Sean Erickson 维护。



  • lingoer, tangplin 和 Sean

SwiftyJSearch

SwiftyJSearch 扩展了 SwiftyJSON 的 JSON 搜索功能。

  1. SwiftyJSON
  2. 要求
  3. 集成
  4. 用法
  5. 元数据

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变量中删除int8int8ValueuInt8仍然有效且可用。

元数据

SwiftyJSON - SwiftyJSON SwiftyJSON作者 - lingoerwongzigiiLuke Tang

SwiftyJSearch作者 - Sean Erickson [email protected]