在Swift中将字典转换为JSON

23 浏览
0 Comments

在Swift中将字典转换为JSON

我创建了下一个字典:\nvar postJSON = [ids[0]:answersArray[0], ids[1]:answersArray[1], ids[2]:answersArray[2]] as Dictionary\n\n然后我得到了:\n

[2: B, 1: A, 3: C]

\n那么,我该如何将其转换为JSON格式?

0
0 Comments

问题的出现原因是:在Swift中,将字典转换为JSON时,需要使用JSONEncoder进行编码。但是,字典的键和值必须实现Codable协议。对于字符串、整数和浮点数等基本类型,它们已经实现了Codable协议,可以直接使用。但是,注意Any类型不符合Codable协议,所以无法直接将包含Any类型的字典转换为JSON。

解决方法是:将包含Any类型的字典转换为JSON之前,需要将数据适配为Codable类型,这样可以更好地利用Swift的类型系统,并且能够更清晰地表达编码的结果。可以参考苹果官方文档中的"Encoding and Decoding Custom Types"部分,了解如何自定义类型以实现Codable协议。这样一来,就能够使用JSONEncoder进行编码,得到符合预期的JSON结果。

需要注意的是,现在的做法已经不推荐使用[String: Any]这种字典类型,因为它比较模糊,不利于编译时的类型检查。通常情况下,我们会使用自定义类型来代替[String: Any],这样可以更好地利用Swift的强类型特性,并且能够在编译时进行更好的验证。对于这种情况,可以参考官方文档中的"Using JSON with Custom Types"部分,了解如何使用自定义类型来处理JSON数据。当然,有时候可能不得不使用JSONSerialization,特别是在与Objective-C集成的旧代码中,但是现在的首选解决方案是使用JSONEncoder。

总之,在Swift中将字典转换为JSON时,需要注意字典的键和值是否实现了Codable协议,如果包含了Any类型,需要先将数据适配为Codable类型。推荐使用自定义类型来处理JSON数据,以利用Swift的类型系统和编译时验证的优势。使用JSONEncoder进行编码可以得到更好的结果,而JSONSerialization则是一种备选方案。

0
0 Comments

问题的出现原因:问题的提问者错误地假设,他认为字典在调试器/Playground中显示为方括号的形式(这是Cocoa显示字典的方式),就意味着JSON输出的格式也是这样的。

问题的解决方法:提供了一段代码示例,用于将字符串字典转换为JSON格式。通过使用JSONSerialization的data方法,将字典转换为Data类型,然后使用String的data方法将Data类型转换为字符串,并指定编码方式为ASCII。最后打印出转换后的JSON字符串。

代码示例中还提供了一种"pretty printed"的格式,只需在options参数中添加.prettyPrinted选项即可。

在Swift 2语法中,使用NSJSONSerialization的dataWithJSONObject方法将字典转换为NSData类型,再使用NSString的data方法将NSData类型转换为字符串,并指定编码方式为ASCII。

最后输出的结果是字典以大括号括起来的JSON字符串,与预期结果一致。

编辑部分提供了Swift 3/4语法的代码示例,与之前的代码示例功能相同。

文章整理自Stack Overflow网站的问题和回答。

0
0 Comments

在Swift 3.0中,根据Swift API设计准则,NSJSONSerialization及其方法的名称已更改。

在Swift 3中,我们可以使用JSONSerialization类替代NSJSONSerialization类。下面是将字典转换为JSON的示例代码:

let dic = ["2": "B", "1": "A", "3": "C"]

do {

let jsonData = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)

// 在这里,"jsonData"是以JSON数据编码的字典

let decoded = try JSONSerialization.jsonObject(with: jsonData, options: [])

// 在这里,"decoded"是从JSON数据解码出的类型为`Any`的对象

// 现在你可以将其转换为正确的类型

if let dictFromJSON = decoded as? [String:String] {

// 使用dictFromJSON

}

} catch {

print(error.localizedDescription)

}

在Swift 2.x中,我们可以使用NSJSONSerialization类将字典转换为JSON。下面是在Swift 2.x中的示例代码:

do {

let jsonData = try NSJSONSerialization.dataWithJSONObject(dic, options: NSJSONWritingOptions.PrettyPrinted)

// 在这里,"jsonData"是以JSON数据编码的字典

let decoded = try NSJSONSerialization.JSONObjectWithData(jsonData, options: [])

// 在这里,"decoded"是从JSON数据解码出的类型为`AnyObject`的对象

// 现在你可以将其转换为正确的类型

if let dictFromJSON = decoded as? [String:String] {

// 使用dictFromJSON

}

} catch let error as NSError {

print(error)

}

在Swift 1中,我们可以使用NSJSONSerialization类将字典转换为JSON。下面是在Swift 1中的示例代码:

var error: NSError?

if let jsonData = NSJSONSerialization.dataWithJSONObject(dic, options: NSJSONWritingOptions.PrettyPrinted, error: &error) {

if error != nil {

println(error)

} else {

// 在这里,"jsonData"是以JSON数据编码的字典

}

}

if let decoded = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as? [String:String] {

if error != nil {

println(error)

} else {

// 在这里,"decoded"是从JSON数据解码出的字典

}

}

以上是将字典转换为JSON的示例代码。在Swift 3中,我们使用JSONSerialization类,而在Swift 2.x和Swift 1中,我们使用NSJSONSerialization类进行相同的操作。根据Swift API设计准则,Swift 3中的类名称及其方法已更改。

0