DrP*_*nce 55 string json ios swift
如何在swift中将数组转换为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)
}
Run Code Online (Sandbox Code Playgroud)
我还想使用我的方法返回JSON字符串savetoDictionart().
Dav*_*rry 107
当你将它转换为数据时,然后尝试将数据转换为对象作为JSON(失败,它不是JSON)并将其转换为字符串,基本上你有一堆无意义的转换.
只要数组只包含JSON可编码值(字符串,数字,字典,数组,nil),您就可以使用NSJSONSerialization来执行此操作.
而只需执行array-> data-> string部分:
斯威夫特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))")
Run Code Online (Sandbox Code Playgroud)
原始答案
let array = [ "one", "two" ]
let data = NSJSONSerialization.dataWithJSONObject(array, options: nil, error: nil)
let string = NSString(data: data!, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)
虽然您可能不应该使用强制解包,但它为您提供了正确的起点.
Jon*_*gel 53
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)
}
Run Code Online (Sandbox Code Playgroud)
JSONSerialization.WritingOptions.prettyPrinted如果要在调试器中将其打印出来,该选项会以最易于阅读的格式将其提供给最终消费者.
参考:Apple文档
该JSONSerialization.ReadingOptions.mutableContainers选项允许您改变返回的数组和/或字典.
所有ReadingOptions的参考:Apple文档
注意:Swift 4能够使用新协议对对象进行编码和解码.这是Apples文档,以及一个开始示例的快速教程.
Rob*_*hen 20
如果您已经在使用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)
Run Code Online (Sandbox Code Playgroud)
SWIFT 3更新
let paramsJSON = JSON(paramsArray)
let paramsString = paramsJSON.rawString(String.Encoding.utf8, options: JSONSerialization.WritingOptions.prettyPrinted)!
Run Code Online (Sandbox Code Playgroud)
JSON字符串很适合传输,因为您可以对JNS编码HTTP主体,因此不常出现这种情况.但是JSON stringify的一个潜在用例是Multipart Post,AlamoFire nows支持它.
雨燕5
此泛型extension会将对象转换array为 JSON,string其中可以是:
。
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
例子:
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")
])
]
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
JSONEncoder.encode(from: Person.sampleData())
Run Code Online (Sandbox Code Playgroud)
输出:
这将创建以下格式正确的Output.json文件:
[
{
"name" : "Adam",
"pets" : [
]
},
{
"name" : "Jane",
"pets" : [
{
"type" : "Cat"
}
]
},
{
"name" : "Robert",
"pets" : [
{
"type" : "Cat"
},
{
"type" : "Rabbit"
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
环球银行金融电信协会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)
}
Run Code Online (Sandbox Code Playgroud)
注意:-当您想使用时,请使用tempJson变量。
小智 5
如何在swift 2.3中将数组转换为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)
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用yourSting作为JSON字符串..
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
}
}
Run Code Online (Sandbox Code Playgroud)
如果您在模型中使用 Codable 协议,这些扩展可能有助于获取字典表示(Swift 4)
| 归档时间: |
|
| 查看次数: |
88886 次 |
| 最近记录: |