6

我有一个 swiftyJSON 对象,例如:

[{
  "location" : "http://...",
  "img" : "http://...",
  "commentCount" : 0,
  "timestamp" : 1432460217550,
}]

我希望能够将另一个 swiftyJSON 对象附加到它,使其看起来像:

[{
  "location" : "http://...",
  "img" : "http://...",
  "commentCount" : 0,
  "timestamp" : 1432460217550,
},
{
  "location" : "http://...",
  "img" : "http://...",
  "commentCount" : 1,
  "timestamp" : 1432460217571,
}
]

我不能在 swiftyJSON 对象上使用+=或。.append我怎样才能做到这一点?

4

5 回答 5

9

正如您所说,swiftyJSON 没有附加功能。

您可以做的是将 swiftyJSON 对象解析为 anyObject 类型的数组并附加它们。

let json = JSON(data: data!) 
var JSONObject = JSON(json["content"].arrayObject! + json["content"].arrayObject!)

从 HTTP 请求接收到的数据-> NSData 对象。

于 2015-05-24T23:32:54.293 回答
6
extension JSON {
    mutating func merge(other: JSON) {
        for (key, subJson) in other {
            self[key] = subJson
        }
    }

    func merged(other: JSON) -> JSON {
        var merged = self
        merged.merge(other: other)
        return merged
    }
}
于 2016-05-11T04:33:33.497 回答
3

我喜欢@user2215977 的答案,但我还需要合并嵌套的 JSON。我将扩展扩展为合并嵌套的 JSON 和数组,而包含 JSON 的数组并未合并,而是都在新生成的 JSON 的数组中。

导入 SwiftyJSON

extension JSON {
    mutating func merge(other: JSON) {
        if self.type == other.type {
            switch self.type {
                case .dictionary:
                    for (key, _) in other {
                        self[key].merge(other: other[key])
                    }
                case .array:
                    self = JSON(self.arrayValue + other.arrayValue)
                default:
                    self = other
            }
        } else {
            self = other
        }
    }

    func merged(other: JSON) -> JSON {
        var merged = self
        merged.merge(other: other)
        return merged
    }
}

为了说明用法,我还将发布对此扩展的测试。

import XCTest
import SwiftyJSON

class JSONTests: XCTestCase {
    func testPrimitiveType() {
        let A = JSON("a")
        let B = JSON("b")
        XCTAssertEqual(A.merged(other: B), B)
    }

    func testMergeEqual() {
        let json = JSON(["a": "A"])
        XCTAssertEqual(json.merged(other: json), json)
    }

    func testMergeUnequalValues() {
        let A = JSON(["a": "A"])
        let B = JSON(["a": "B"])
        XCTAssertEqual(A.merged(other: B), B)
    }

    func testMergeUnequalKeysAndValues() {
        let A = JSON(["a": "A"])
        let B = JSON(["b": "B"])
        XCTAssertEqual(A.merged(other: B), JSON(["a": "A", "b": "B"]))
    }

    func testMergeFilledAndEmpty() {
        let A = JSON(["a": "A"])
        let B = JSON([:])
        XCTAssertEqual(A.merged(other: B), A)
    }

    func testMergeEmptyAndFilled() {
        let A = JSON([:])
        let B = JSON(["a": "A"])
        XCTAssertEqual(A.merged(other: B), B)
    }

    func testMergeArray() {
        let A = JSON(["a"])
        let B = JSON(["b"])
        XCTAssertEqual(A.merged(other: B), JSON(["a", "b"]))
    }

    func testMergeNestedJSONs() {
        let A = JSON([
            "nested": [
                "A": "a"
            ]
        ])

        let B = JSON([
            "nested": [
                "A": "b"
            ]
        ])

        XCTAssertEqual(A.merged(other: B), B)
    }
}
于 2016-11-17T13:31:32.183 回答
1

维克多的回答对我不起作用。但我通过将我的 JSON 对象 ,data放入这样的数组中解决了这个问题:

var data: [JSON] = []

并使用以下代码:

self.data = self.data + JSON["content"].arrayValue
于 2015-05-25T09:57:31.987 回答
0

这现在在 SwiftyJSON 中得到支持。

myJson.merged(with: otherJson)

你可以在他们的合并测试中看到这样的例子

https://github.com/SwiftyJSON/SwiftyJSON/blob/8bbb74eec7366de10f78a05fc9dff588337c117e/Tests/SwiftJSONTests/MergeTests.swift

于 2020-05-10T14:15:11.357 回答