Преобразование массива в строку 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()
.
Ответы
Ответ 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. Вы редко хотите, чтобы данные были строкой; только для целей отладки.