Swift 中 Json 的“旧式 ASCII 属性列表”

Posted

技术标签:

【中文标题】Swift 中 Json 的“旧式 ASCII 属性列表”【英文标题】:“Old-Style ASCII Property List” to Json in Swift 【发布时间】:2020-12-31 15:49:54 【问题描述】:

我有一个如下所示的字符串:

\n    \"account_no\" = \"5675672343244\";\n    \"account_kind\" =     \n        \".tag\" = test,\n    ;\n    country = US;\n    disabled = 0;\n    email = \"test@gmail.com\";\n    \"email_verified\" = 1;\n    \"is_paired\" = 0;\n    ;\n"

当它作为描述打印到控制台时,它类似于 NSDictionary。特别是

有些字符串用引号引起来,有些则没有。见country = US;\n 他们使用带有= 的k-v 表示法。例如。 key = value 他们使用分隔符;

不幸的是,我没有创建字符串的原始对象。我只有字符串本身。

我的目标是将其转换为有效的 JSON 字符串表示,或者转换回 NSDictionary。应该在 Swift 5 中完成。到目前为止我没有这样做,有没有人有示例代码可以帮助?

【问题讨论】:

【参考方案1】:

NSDictionary 的描述会产生一个“Old-Style ASCII Property List”,而PropertyListSerialization 可用于将其转换回一个对象。

请注意,格式不明确。例如,1234 既可以是数字,也可以是仅由十进制数字组成的字符串。所以不能保证能得到准确的结果。

例子:

let desc = "\n    \"account_no\" = \"5675672343244\";\n    \"account_kind\" =     \n        \".tag\" = test;\n    ;\n    country = US;\n    disabled = 0;\n    email = \"test@gmail.com\";\n    \"email_verified\" = 1;\n    \"is_paired\" = 0;\n"

do 
    let data = Data(desc.utf8)
    if let dict = try PropertyListSerialization.propertyList(from: data, format: nil) as? NSDictionary 
        let json = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
        print(String(data: json, encoding: .utf8)!)
     else 
        print("not a dictionary")
    
 catch 
    print("not a valid property list:", error)

输出:

“国家”:“美国”, “email_verified”:“1”, “is_paired”:“0”, "account_no" : "5675672343244", “电子邮件”:“test@gmail.com”, “禁用”:“0”, “帐户种类”: “.tag”:“测试”

(我必须“修复”描述字符串以使其成为有效的属性列表:“test”后面是逗号而不是分号,字符串末尾有一个不平衡的。)

【讨论】:

谢谢!是的,这就是我要找的东西,感谢正确的名称“旧式 ASCII 属性列表” - 否则我无法找到它。

以上是关于Swift 中 Json 的“旧式 ASCII 属性列表”的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 2 中解析 json 对象

在 Swift 中动态构建 JSON

检查目录中是不是存在 JSON 文件 - Swift

在 Swift 3 中解析 JSON,就像 Apple 的 Swift 2 示例一样

在 Swift 中写入 JSON 中的***类型无效

JSON 解析 --> Swift | JSON 写入中的***类型无效