微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Swift 中 Json 的“旧式 ASCII 属性列表”

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

{\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 中完成。到目前为止我没有这样做,有没有人有帮助的示例代码

解决方法

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)
}

输出:

{
  "country" : "US","email_verified" : "1","is_paired" : "0","account_no" : "5675672343244","email" : "test@gmail.com","disabled" : "0","account_kind" : {
    ".tag" : "test"
  }
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。