Как добавить новые данные в существующий массив JSON (swiftyJSON)

У меня есть массив данных SwiftyJson, которые я объявил и заполнил данными. Код, который я использую для заполнения массива hoge, таков: self.hoge = JSON(data: data!)

но мне нужно добавить новые данные swiftyJSON в этот массив hoge. Я заметил, что у массива hoge нет свойства append. Как мне это сделать?

Спасибо


person user970956    schedule 14.03.2015    source источник
comment
Он говорит о Swift не объективно c.   -  person Nikos M.    schedule 14.03.2015
comment
@adnan Я объявил hoge следующим образом `var hoge:JSON = []`, и как только я изменил его тип на NSMutableArray, я получил сообщение об ошибке, в котором говорится, что JSON не может быть преобразован в NSMutableArray. Что я сделал не так? Спасибо.   -  person user970956    schedule 14.03.2015
comment
Я согласен, я думаю, что у Swiftyjson может быть более удобная документация: ›   -  person user798719    schedule 30.09.2018


Ответы (7)


SwiftyJSON не имеет функций append или extend.

Вы можете:

self.hoge = JSON(self.hoge.arrayObject! + JSON(data: newData).arrayObject!)

Но я рекомендую объявить self.hoge как [JSON]

var hoge:[JSON] = []

func readMoreData() {

    let newData: NSData = ...

    if let newArray = JSON(data:newData).array {
        self.hoge += newArray
    }
}
person rintaro    schedule 14.03.2015
comment
.Спасибо, он отлично работает и добавляет новые данные в hoge. единственная оставшаяся проблема заключается в том, что я раньше возвращал данные из hoge, как это self.hoge[indexPath.row]["cars"]["pic_name"], но теперь я получил ошибку, которая говорит, что не может индексировать пустой буфер. Как теперь вернуть данные? Спасибо еще раз - person user970956; 14.03.2015
comment
Пробовал, но оператор += не работает с объектами JSON. Пожалуйста, поправьте меня, если я ошибаюсь. - person Yuichi Kato; 15.08.2015

Свифт 2-4

Другое решение, использующее Extension

extension JSON{
    mutating func appendIfArray(json:JSON){
        if var arr = self.array{
            arr.append(json)
            self = JSON(arr);
        }
    }
    
    mutating func appendIfDictionary(key:String,json:JSON){
        if var dict = self.dictionary{
            dict[key] = json;
            self = JSON(dict);
        }
    }
}

Использовать:

var myJSON: JSON = [
    "myDictionary": [String:AnyObject](),
    "myArray" : [1,2,3,4]
]

myJSON["myDictionary"].appendIfDictionary(key:"A", json: JSON(["key1":"value1"]))
myJSON["myDictionary"].appendIfDictionary(key: "B", json: JSON(["key2":"value2"]))
myJSON["myArray"].appendIfArray(json: JSON(5))

Распечатать:

{
  "myArray" : [
    1,
    2,
    3,
    4,
    5
  ],
  "myDictionary" : {
    "B" : {
      "key2" : "value2"
    },
    "A" : {
      "key1" : "value1"
    }
  }
}
person Daniel Krom    schedule 02.05.2016
comment
но не сохраняет.... скомпилирован с оптимизацией - степпинг может вести себя странно; переменные могут быть недоступны. появилась ошибка и после закрытия приложения ничего не меняется - person Dumitru Rogojinaru; 02.02.2017
comment
@DumiruRogojinaru Я не проверял это на Swift 3, поэтому, думаю, что-то изменилось, я обновлю свой ответ в ближайшие несколько дней. - person Daniel Krom; 02.02.2017

Для этого можно использовать функцию merge. https://github.com/SwiftyJSON/SwiftyJSON#merging

var array: JSON = [1, 2, 3]
array = try! array.merged(with: [4])
// -> [1, 2, 3, 4]
person Lindemann    schedule 15.03.2017

let jsonNewJSON:JSON = JSON(newData)
var arr:[JSON]=jsonOBJ.arrayValue
arr.append(jsonNewJSON)
var combinedOBJ = JSON(arr)

Я использовал приведенный выше код для добавления к массиву swiftyjson. Сначала я преобразовал новые данные в объект JSON. Затем я получил массив существующего JSON и добавил новый JSON. Я преобразовал массив обратно в объект JSON. По общему признанию, не очень хороший код, но мне не нужна была производительность, и он выполнил свою работу.

person yeahdixon    schedule 13.07.2016

Объявите свой основной массив JSON как:

var data:[JSON] = []

Если источником данных является любой другой объект (например, область), выполните цикл по нему, используя цикл for. Но если источником данных является другой массив JSON, выполните:

func setData(){
        data = []
        if let items = sourceData.array {
            for item in items {
              data.append(item)
            }
        }
        collectionView.reloadData()
    }
person Moonis Abidi    schedule 02.11.2019

self.hoge должен быть Swift Array (который может быть изменен, если объявлен как var) или преобразован в NSMutableArray. Если он имеет тип Array, используйте append. При приведении к NSMutableArray используйте self.hoge.addObject(yourObject).

person Nikos M.    schedule 14.03.2015
comment
Я объявил hoge следующим образом: var hoge:JSON = []. Как мне это изменить? Я связал его, чтобы преобразовать в NSMutableArray, что дало мне ошибку, что JSON не может быть преобразован в NSMutableArray. Не могли бы вы помочь мне с этим Пожалуйста?Спасибо - person user970956; 14.03.2015
comment
объявить его как hoge = [JSON]() - person Nikos M.; 14.03.2015

Мне нужно было добавить словарь к данным JSON в моем проекте. Я добавил к ответу Даниэля Крома выше:

import SwiftyJSON

extension JSON {
    
    mutating func appendIfKeyValuePair(key: String, value: Any){
        if var dict = self.dictionaryObject {
            dict[key] = value
            self = JSON(dict)
        }
    }
}

Применение:

var data: JSON = []

data.appendIfKeyValuePair(key: "myKey", value: "myValue")
person GIJoeCodes    schedule 28.01.2021