无法使用 Swift 2 将空数组转换为 JSON

Posted

技术标签:

【中文标题】无法使用 Swift 2 将空数组转换为 JSON【英文标题】:Cannot convert empty array of arrays to JSON with Swift 2 【发布时间】:2015-07-31 06:37:52 【问题描述】:

这段代码有什么问题(受this 示例的启发)?它当前打印 JSON 字符串 "(<5b5d>, 4)" 而不是预期的 "[]"

var tags: [[String]] = []
// tags to be added later ...
do 
    let data = try NSJSONSerialization.dataWithJSONObject(tags, options: [])
    let json = String(data: data, encoding: NSUTF8StringEncoding)
    print("\(json)")

catch 
    fatalError("\(error)")

【问题讨论】:

【参考方案1】:

简答: JSON 数据的创建是正确的。问题出在 将数据转换为字符串,你想要的是NSString方法:

let json = NSString(data: data, encoding: NSUTF8StringEncoding) as! String

产生预期的[]

答案稍长: 你的代码

let json = String(data: data, encoding: NSUTF8StringEncoding)

调用String init 方法

/// Initialize `self` with the textual representation of `instance`.
/// ...
init<T>(_ instance: T)

结果是 tuple 的文本表示 (data: data, encoding: NSUTF8StringEncoding):

(<5b5d>, 4)

其实你可以用任意参数调用String()

let s = String(foo: 1, bar: "baz")
print(s) // (1, "baz")

在 Swift 2 中。这不能在 Swift 1.2 中编译,所以我不确定是否 这是有意或无意。我在 苹果开发者论坛:

String init accepts arbitrary arguments。

【讨论】:

多么“桥梁”! :) 谢谢。 绝对精彩。无论如何,您只是将 JSON 数据转换为字符串进行调试。 而且我在任何地方都找不到任何保证 JSON 数据将是 UTF-8 编码的保证。 @gnasher729:这不是保证,但tools.ietf.org/html/rfc7159#section-8.1 声明:“默认编码是 UTF-8,...”。 – 另一方面,OP 的原始代码现在可以正常工作,因为String 现在有一个init?(data: NSData, encoding: NSStringEncoding) 方法。 @gnasher729:dataWithJSONObject 的文档也明确指出:“结果数据以 UTF-8 编码。”

以上是关于无法使用 Swift 2 将空数组转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Lua 脚本将空数组转换为对象

Swift Codable 将空 json 解码为 nil 或空对象

在 Swift/Xcode 中将 JSON 文件转换为数组

将 swift 数组转换为对象以进行 json 序列化

在 Swift 4 中将 Json 对象转换为数组格式

Swift json 解析错误:无法将 NSCFConstantString 类型的值转换为 NSArray