2015-05-24 47 views
5

Mam obiekt swiftyJSON który wygląda jak na przykład:Jak połączyć dwa SwiftyJSON obiektów

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

Chcę, aby móc dołączyć inny obiekt swiftyJSON do niego tak, że wygląda tak:

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

Nie mogę użyć += ani .append na obiektach SWIFTYJSON. Jak mogę to zrobić?

Odpowiedz

0

Odpowiedź Victora nie zadziałała dla mnie. Ale rozwiązać kwestię poprzez umieszczenie mojego obiektu JSON, data, do tablicy jak poniżej:

var data: [JSON] = [] 

i stosując następujący kod:

self.data = self.data + JSON["content"].arrayValue 
8

Jak już powiedziałeś, swiftyJSON nie ma funkcji dołączania.

Co możesz zrobić, to sparsować obiekty SWIFTYJSON w tablicy typu anyObject i dołączyć je.

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

danych -> NSData Obiekt otrzymał od żądania HTTP.

4
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 
    } 
} 
2

lubiłem Odpowiedź @ user2215977, ale potrzebowałem również połączenia zagnieżdżonych JSON-ów. Rozszerzyłem rozszerzenie, aby scalić zagnieżdżone JSON-y i tablice, podczas gdy tablice zawierające JSON-y nie są scalone, ale znajdują się w tablicy nowo wygenerowanego JSON.

import 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 
    } 
} 

W celu zilustrowania użycia wyślę moje testy dla tego rozszerzenia, jak również.

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) 
    } 
}