Как объединить два объекта SwiftyJSON

У меня есть объект 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,
}
]

Я не могу использовать += или .append для объектов swiftyJSON. Как я могу это сделать?


person Tometoyou    schedule 24.05.2015    source источник


Ответы (5)


Как вы сказали, у swiftyJSON нет функции добавления.

Что вы можете сделать, так это разобрать объекты swiftyJSON в массив типа anyObject и добавить их.

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

Данные -> Объект NSData, полученный из HTTP-запроса.

person Victor Tavares    schedule 24.05.2015

Мне понравился ответ @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)
    }
}
person Kie    schedule 17.11.2016

Ответ Виктора мне не помог. Но я решил вопрос, поместив свой объект JSON, data, в такой массив:

var data: [JSON] = []

и используя следующий код:

self.data = self.data + JSON["content"].arrayValue
person Tometoyou    schedule 25.05.2015

Теперь это поддерживается в SwiftyJSON.

myJson.merged(with: otherJson)

Вы можете увидеть примеры этого в их тестах слияния.

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

person joehinkle11    schedule 10.05.2020

person    schedule
comment
Идеально в Swift 4. Спасибо. - person BennyTheNerd; 01.12.2018