【问题标题】:Swift Codable Protocol. String encoding issueSwift 可编码协议。字符串编码问题
【发布时间】:2021-01-14 12:59:42
【问题描述】:

最近我在对符合 Codable 协议的实体进行编码时遇到了一个问题。

这是 Playground 的代码:

class Person: Codable {
    var name: String?
    var age: Int?
    var isDev: Bool?
}

let p1 = Person()
p1.name = "John N."
p1.age = 13
p1.isDev = false

let p2 = Person()
p2.name = "Jack"
p2.age = 19
p2.isDev = true

let people = [p1, p2]
let data = try JSONEncoder().encode(people)
let j = try! JSONSerialization.jsonObject(with: data, options: [])

print(j)

这是我在 Playground 控制台中得到的输出:

如您所见,编码后的 p1 名称带有引号,但 p2 没有。所以我的问题是为什么?

附:我注意到的唯一一件事是添加例如设置字符串值时任何地方的空格符号或下划线在 json 中添加引号。 p1.name 包含一个空格,因此它被正确编码。

感谢任何想法。

【问题讨论】:

  • 您正在打印一个字典对象。这与 JSON 或编码无关,而仅与对象打印到控制台的方式有关。带空格的字符串加引号,不带空格的字符串不加引号。
  • 值包含空格的时候就是这样打印的,你不用担心
  • 谢谢你们的解释。我已将编码实体发送到应用程序端点之一,尽管它在 Playground 中像这样打印,但它确实可以正常工作

标签: json swift codable encodable


【解决方案1】:

j 是反序列化的 JSON 对象,而不是 JSON 字符串(编码数据)。如果您想查看 JSON,请将 data 转换为字符串,因为 that 是 JSON:

print(String(data: data, encoding: .utf8)!)

j 实际上是使用NSArrays 和NSDictionarys 表示的JSON 数据。事实证明,如果您打印带有字符串的NSDictionarys,引号将添加到包含空格和/或其他特殊字符的字符串中,以告诉您字符串实际开始和结束的位置。

比较:

print(["name": "hello"] as NSDictionary)
print(["name": "hello world"] as NSDictionary)
print(["hello"] as NSArray)
print(["hello world"] as NSArray)

输出:

{
    name = hello;
}
{
    name = "hello world";
}
(
    hello
)
(
    "hello world"
)

【讨论】:

    【解决方案2】:

    此答案不会解决实际问题,但我认为这是作者希望实现的问题。在发布的代码 sn-p 中,您实际上是在打印字典,而不是 JSON 字符串。你正在做以下事情:

    1. Person 对象转换为 JSON 数据
    2. 将 JSON 数据转换为 Dictionary
    3. 打印字典

    回想一下,JSON 数据实际上是 JSON 字符串的字节表示。

    您可以通过以下方式检查 JSON 字符串:

    class Person: Codable {
        var name: String?
        var age: Int?
        var isDev: Bool?
    }
    
    let p1 = Person()
    p1.name = "John N."
    p1.age = 13
    p1.isDev = false
    
    let p2 = Person()
    p2.name = "Jack"
    p2.age = 19
    p2.isDev = true
    
    let people = [p1, p2]
    let data = try JSONEncoder().encode(people)
    let jsonString = String(data: data, encoding: .utf8)
    
    print(jsonString ?? "invalid JSON data")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2020-10-07
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多