ios - 在改变它们的同时传递 JSON 对象

标签 ios json swift swifty-json

您如何构建一个 JSON 对象,可以在更新原始引用的同时由多个处理程序传递和修改?

JSON 由 Swift 中的字典和数组支持,它们都是 Struct 数据结构。根据定义,结构是按副本传递的。

这是我写的一个简单的单元测试

func testMutatingJson() {
    // Test
    var json: JSON = [
        "dict": [String: AnyObject]()
    ]

    json["dict"]["A"] = JSON(["key1": "value1"])
    json["dict"]["A"]["B"] = JSON(["key2": "value2"])

    XCTAssertEqual(json["dict"]["A"]["B"], JSON(["key2": "value2"]))

    let wrapper = Wrapper(json: json["dict"])
    wrapper.doSomething()

    // FAIL: This will fail since json["dict"]["A"]["B"] was copied into `Wrapper`
    XCTAssertEqual(json["dict"]["A"]["B"]["C"], JSON(["key3": "value3"]))
}

class Wrapper {

    var json: JSON

    init(json: JSON) {
        self.json = json["A"]["B"]
    }

    func doSomething() {
        self.json["C"] = JSON(["key3", "value3"])
    }

}

我需要修改原始 JSON 对象,因为它将在 doSomething() 之后再次处理。

我认为我最好的选择是编写我自己的由 NSMutableDictionary 和 NSMutableArray 支持的 JSON 类。还有其他选择吗?

最佳答案

基本上,您已经有了解决方案 - 创建一个包装器对象,为包含的 JSON 结构提供引用语义。您还可以重构您的代码,这样您就不会保留 JSON 对象的额外副本。

关于ios - 在改变它们的同时传递 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37925423/

相关文章:

ios - 如何使用 NSAttributedString 在 Swift 中将图像添加为文本附件?

ios - 如何在表格 View 的坐标空间中获取表格 View 单元格的框架?

ios - 从浏览器加载回 iOS 应用程序时,进度指示器无法停止动画

php - json_encode "not working"正确吗?

java - 在数组之前用 2 个对象解析 JSON

javascript - NodeJS - 在 Windows 上解析另一个 JSON 中的 JSON 字符串时出现问题

ios - 如何在 swift 3 中使用 FirebaseAuthUI

html - 在 Safari iOS 13 上始终显示滚动条

ios - 处理消息 View

ios - 随机 UISearchDisplayController 崩溃 (iOS 7)