如何合并两个 SwiftyJSON 对象
How to combine two SwiftyJSON objects
我有一个 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
。我该怎么做?
正如你所说,swiftyJSON 没有追加功能。
您可以做的是将 swiftyJSON 对象解析为一个 anyObject 类型的数组并追加它们。
let json = JSON(data: data!)
var JSONObject = JSON(json["content"].arrayObject! + json["content"].arrayObject!)
数据 -> 从 HTTP 请求接收到的 NSData 对象。
Victor 的回答对我不起作用。但是我通过将我的 JSON 对象 data
放入这样的数组中解决了这个问题:
var data: [JSON] = []
并使用以下代码:
self.data = self.data + JSON["content"].arrayValue
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
}
}
我喜欢@user2215977 的回答,但我还需要合并嵌套的 JSON。我将扩展扩展为合并嵌套的 JSONs 和数组,而包含 JSONs 的数组不会合并,但都在新生成的 JSON.[=12= 的数组中]
导入 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
}
}
为了说明用法,我也会 post 我对此扩展的测试。
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)
}
}
SwiftyJSON 现已支持此功能。
myJson.merged(with: otherJson)
你可以在他们的合并测试中看到这方面的例子
我有一个 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
。我该怎么做?
正如你所说,swiftyJSON 没有追加功能。
您可以做的是将 swiftyJSON 对象解析为一个 anyObject 类型的数组并追加它们。
let json = JSON(data: data!)
var JSONObject = JSON(json["content"].arrayObject! + json["content"].arrayObject!)
数据 -> 从 HTTP 请求接收到的 NSData 对象。
Victor 的回答对我不起作用。但是我通过将我的 JSON 对象 data
放入这样的数组中解决了这个问题:
var data: [JSON] = []
并使用以下代码:
self.data = self.data + JSON["content"].arrayValue
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
}
}
我喜欢@user2215977 的回答,但我还需要合并嵌套的 JSON。我将扩展扩展为合并嵌套的 JSONs 和数组,而包含 JSONs 的数组不会合并,但都在新生成的 JSON.[=12= 的数组中]
导入 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
}
}
为了说明用法,我也会 post 我对此扩展的测试。
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)
}
}
SwiftyJSON 现已支持此功能。
myJson.merged(with: otherJson)
你可以在他们的合并测试中看到这方面的例子