Подтвердить что ты не робот

Преобразование массива в строку JSON в swift

Как преобразовать массив в строку JSON в swift? В основном у меня есть текстовое поле с встроенной в него кнопкой. При нажатии кнопки текст текстового поля добавляется к testArray. Кроме того, я хочу преобразовать этот массив в строку JSON.

Это то, что я пробовал:

func addButtonPressed() {
    if goalsTextField.text == "" {
        // Do nothing
    } else {
        testArray.append(goalsTextField.text)
        goalsTableView.reloadData()
        saveDatatoDictionary()
    }
}

func saveDatatoDictionary() {
    data = NSKeyedArchiver.archivedDataWithRootObject(testArray)
    newData = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(), error: nil) as? NSData
    string = NSString(data: newData!, encoding: NSUTF8StringEncoding) 
    println(string)
}

Я также хотел бы вернуть строку JSON, используя мой метод savetoDictionart().

4b9b3361

Ответ 1

Как бы то ни было, вы конвертируете его в данные, а затем пытаетесь преобразовать данные в объект как JSON (который не работает, а не JSON) и преобразовывая это в строку, в основном у вас есть куча бессмысленных преобразований.

Пока массив содержит только кодируемые значения JSON (строка, число, словарь, массив, ноль), вы можете просто использовать NSJSONSerialization для этого.

Вместо этого просто массивные части → data- > :

let array = [ "one", "two" ]
let data = NSJSONSerialization.dataWithJSONObject(array, options: nil, error: nil)
let string = NSString(data: data!, encoding: NSUTF8StringEncoding)

хотя вы, вероятно, не должны использовать принудительное разворачивание, оно дает вам правильную отправную точку.

Swift 3:

func notPrettyString(from object: Any) -> String? {
    if let objectData = try? JSONSerialization.data(withJSONObject: object, options: JSONSerialization.WritingOptions(rawValue: 0)) {
        let objectString = String(data: objectData, encoding: .utf8)
        return objectString
    }
    return nil
}

Ответ 2

версия Swift 3.0 - 4.0

do {

    //Convert to Data
    let jsonData = try JSONSerialization.data(withJSONObject: dictionaryOrArray, options: JSONSerialization.WritingOptions.prettyPrinted)

    //Convert back to string. Usually only do this for debugging
    if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
       print(JSONString)
    }

    //In production, you usually want to try and cast as the root data structure. Here we are casting as a dictionary. If the root object is an array cast as [Any].
    var json = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any]


} catch {
    print(error.description)
}

Опция JSONSerialization.WritingOptions.prettyPrinted предоставляет ее потенциальному потребителю в удобном для чтения формате, если они должны были распечатать его в отладчике.

Ссылка: Документация для Apple

Параметр JSONSerialization.ReadingOptions.mutableContainers позволяет вам мутировать возвращенный массив и/или словари.

Ссылка для всех ReadOptions: Документация Apple

ПРИМЕЧАНИЕ. Swift 4 имеет возможность кодировать и декодировать ваши объекты с использованием нового протокола. Вот Документация яблок и быстрый учебник для стартового примера.

Ответ 3

Если вы уже используете SwiftyJSON:

https://github.com/SwiftyJSON/SwiftyJSON

Вы можете сделать это:

// this works with dictionaries too
let paramsDictionary = [
    "title": "foo",
    "description": "bar"
]
let paramsArray = [ "one", "two" ]
let paramsJSON = JSON(paramsArray)
let paramsString = paramsJSON.rawString(encoding: NSUTF8StringEncoding, options: nil)

ОБНОВЛЕНИЕ SWIFT 3

 let paramsJSON = JSON(paramsArray)
 let paramsString = paramsJSON.rawString(String.Encoding.utf8, options: JSONSerialization.WritingOptions.prettyPrinted)!

Строки JSON, которые хороши для транспорта, часто возникают, потому что вы можете JSON кодировать тело HTTP. Но один потенциальный прецедент для JSON stringify - это Multipart Post, который поддерживает AlamoFire.

Ответ 4

SWIFT 2.0

var tempJson : NSString = ""
do {
    let arrJson = try NSJSONSerialization.dataWithJSONObject(arrInvitationList, options: NSJSONWritingOptions.PrettyPrinted)
    let string = NSString(data: arrJson, encoding: NSUTF8StringEncoding)
    tempJson = string! as NSString
}catch let error as NSError{
    print(error.description)
}

ПРИМЕЧАНИЕ. - используйте переменную tempJson, если вы хотите использовать.

Ответ 5

Как преобразовать массив в json String в swift 2.3

var yourString : String = ""
do
{
    if let postData : NSData = try NSJSONSerialization.dataWithJSONObject(yourArray, options: NSJSONWritingOptions.PrettyPrinted)
    {
        yourString = NSString(data: postData, encoding: NSUTF8StringEncoding)! as String
    }
}
catch
{
    print(error)
}

И теперь вы можете использовать yourSting как строку JSON..

Ответ 6

Совет. Чтобы преобразовать NSArray, содержащий объекты, совместимые с JSON, в объект NSData, содержащий документ JSON, используйте соответствующий метод NSJSONSerialization. JSONObjectWithData - это не так.

Подсказка 2. Вы редко хотите, чтобы данные были строкой; только для целей отладки.