快速将数组转换为 JSON 字符串

如何快速地将数组转换为 JSON字符串? 基本上,我有一个文本字段,其中嵌入了一个按钮。 当按下按钮时,文本字段文本将添加到 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)
}

我还想使用我的 savetoDictionart()方法返回 JSON字符串。

137301 次浏览

提示: 要将包含 JSON 兼容对象的 NSArray 转换为包含 JSON 文档的 NSData 对象,请使用适当的 NSJSONSerialization 方法。JSONObjectWithData 不是。

提示2: 很少需要将该数据作为字符串; 仅用于调试目的。

按照目前的情况,您正在将其转换为数据,然后尝试将数据转换为 JSON 对象(失败,它不是 JSON)并将其转换为字符串,基本上您有一大堆无意义的转换。

只要数组只包含 JSON 可编码值(字符串、数字、字典、数组、 nil) ,就可以使用 NSJSONSerialization 进行编码。

相反,只需执行数组-> 数据-> 字符串部分:

斯威夫特3/4

let array = [ "one", "two" ]


func json(from object:Any) -> String? {
guard let data = try? JSONSerialization.data(withJSONObject: object, options: []) else {
return nil
}
return String(data: data, encoding: String.Encoding.utf8)
}


print("\(json(from:array as Any))")

原始答案

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

虽然您可能不应该使用强制展开,但是它为您提供了正确的起点。

如果您已经在使用 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)

SWIFT3最新消息

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

JSON 字符串有利于传输,但不经常出现,因为可以对 HTTP 主体进行 JSON 编码。但是 JSON stringify 的一个潜在用例是 Multipart Post,AlamoFire 现在支持它。

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选项会以一种更容易阅读的格式将其提供给他们。

参考资料: 苹果文档

JSONSerialization.ReadingOptions.mutableContainers选项允许您对返回的数组和/或字典进行变异。

所有阅读选项的参考: 苹果文档

注意: Swift 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)
}

注意:- 当您想要使用 TemJson变量时使用 TemJson变量。

如何在 Swift 2.3中将 array 转换为 json String

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

现在你可以使用你的 Sting 作为 JSON 字符串. 。

对于 Swift 3.0,你必须这样做:

var postString = ""
do {
let data =  try JSONSerialization.data(withJSONObject: self.arrayNParcel, options: .prettyPrinted)
let string1:String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String


postString = "arrayData=\(string1)&user_id=\(userId)&markupSrcReport=\(markup)"
} catch {
print(error.localizedDescription)
}
request.httpBody = postString.data(using: .utf8)

100% 工作状态测试

你可以试试这个。

func convertToJSONString(value: AnyObject) -> String? {
if JSONSerialization.isValidJSONObject(value) {
do{
let data = try JSONSerialization.data(withJSONObject: value, options: [])
if let string = NSString(data: data, encoding: String.Encoding.utf8.rawValue) {
return string as String
}
}catch{
}
}
return nil
}
extension Array where Element: Encodable {
func asArrayDictionary() throws -> [[String: Any]] {
var data: [[String: Any]] = []


for element in self {
data.append(try element.asDictionary())
}
return data
}
}


extension Encodable {
func asDictionary() throws -> [String: Any] {
let data = try JSONEncoder().encode(self)
guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
throw NSError()
}
return dictionary
}
}

如果您在模型中使用 Codable 协议,那么这些扩展可能有助于获得字典表示(Swift 4)

对于 Swift 4.2,该代码仍然可以正常工作

 var mnemonic: [String] =  ["abandon",   "amount",   "liar", "buyer"]
var myJsonString = ""
do {
let data =  try JSONSerialization.data(withJSONObject:mnemonic, options: .prettyPrinted)
myJsonString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
} catch {
print(error.localizedDescription)
}
return myJsonString

Swift 5

确保您的对象确认 Codable

Swift 的默认变量类型如 Int、 String、 Double 和... 都是 Codable,这意味着我们可以将主题转换为 Data,反之亦然。

例如,让我们将 Int 数组转换为 StringBase64

let array = [1, 2, 3]
let data = try? JSONEncoder().encode(array)
nsManagedObject.array = data?.base64EncodedString()

如果对核心数据对象使用自定义类,请确保在核心数据模式编辑器和自定义类中 NSManaged变量类型为 String

让我们将 base64字符串转换回 array:

var getArray: [Int] {
guard let array = array else { return [] }
guard let data = Data(base64Encoded: array) else { return [] }
guard let val = try? JSONDecoder().decode([Int].self, from: data) else { return [] }
return val
}

不要将自己的对象转换为 Base64并在 CoreData 中存储为 String,反之亦然,因为我们在 CoreData (数据库)中有一个名为 Relation的对象。

Swift 5

这个通用的 extension将把对象的 array转换成 JSON string,从这里它可以是:

  • 保存到应用程序的文档目录(iOS/MacOS)
  • 直接输出到桌面上的文件(MacOS)

.

extension JSONEncoder {
static func encode<T: Encodable>(from data: T) {
do {
let jsonEncoder = JSONEncoder()
jsonEncoder.outputFormatting = .prettyPrinted
let json = try jsonEncoder.encode(data)
let jsonString = String(data: json, encoding: .utf8)
            

// iOS/Mac: Save to the App's documents directory
saveToDocumentDirectory(jsonString)
            

// Mac: Output to file on the user's Desktop
saveToDesktop(jsonString)
            

} catch {
print(error.localizedDescription)
}
}
    

static private func saveToDocumentDirectory(_ jsonString: String?) {
guard let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
let fileURL = path.appendingPathComponent("Output.json")
        

do {
try jsonString?.write(to: fileURL, atomically: true, encoding: .utf8)
} catch {
print(error.localizedDescription)
}
        

}
    

static private func saveToDesktop(_ jsonString: String?) {
let homeURL = FileManager.default.homeDirectoryForCurrentUser
let desktopURL = homeURL.appendingPathComponent("Desktop")
let fileURL = desktopURL.appendingPathComponent("Output.json")
        

do {
try jsonString?.write(to: fileURL, atomically: true, encoding: .utf8)
} catch {
print(error.localizedDescription)
}
}
}

例如:

struct Person: Codable {
var name: String
var pets: [Pet]
}


struct Pet: Codable {
var type: String
}


extension Person {
static func sampleData() -> [Person] {
[
Person(name: "Adam", pets: []),
Person(name: "Jane", pets: [
Pet(type: "Cat")
]),
Person(name: "Robert", pets: [
Pet(type: "Cat"),
Pet(type: "Rabbit")
])
]
}
}

用法:

JSONEncoder.encode(from: Person.sampleData())

产出:

这将创建以下格式正确的 Output.json文件:

[
{
"name" : "Adam",
"pets" : [


]
},
{
"name" : "Jane",
"pets" : [
{
"type" : "Cat"
}
]
},
{
"name" : "Robert",
"pets" : [
{
"type" : "Cat"
},
{
"type" : "Rabbit"
}
]
}
]