如何从 Swift 4 中的字典创建 JSON?

Posted

技术标签:

【中文标题】如何从 Swift 4 中的字典创建 JSON?【英文标题】:How to create JSON from a dictionary in Swift 4? 【发布时间】:2017-11-28 04:51:18 【问题描述】:

编辑:我已经阅读了关于同一问题的其他答案,但是我无法获得所需的输出。我已经尝试了其他问题中建议的许多变体,但它不起作用。

我有一个 JSON 被剪断,当我打开一个 websocket 时需要将它添加为主体。

sender: "system1@example.com",
recipients:"system2@example.com",
data: 
    text: "Test Message"
,

所以我使用 Swift 做了以下工作,

var messageDictionary : [String: Any] = [
    "sender": "system1@example.com",
    "recipients":"system2@example.com",
    "data": [
        "text": "Test Message"
    ],
]
do 
    let jsonData = try JSONSerialization.data(withJSONObject: messageDictionary, options: .prettyPrinted)
    let jsonString = String(data: jsonData, encoding: String.Encoding.ascii)
    socket.write(string: jsonString!)
    print(jsonString)
 catch 
    print(error.localizedDescription)

当我打印 jsonString 时,我得到了

Optional("\n  \"sender\" : \"system1@example.com\",\n  \"data\" : \n    
    \"text\" : \"Test Message\"\n  ,\n  \"recipients\" : 
    \"system2@example.com\"\n")

作为控制台输出。我希望上面的 sn-p 被格式化为 JSON。 如何在没有 /n 和其他空格的情况下将输出作为普通 JSON 获得? 我正在使用 Swift 4 和 Xcode 9.1

编辑 2

让 jsonData = 尝试 JSONSerialization.data(withJSONObject: messageDictionary, options: []) 让解码 = 尝试 JSONSerialization.jsonObject(with: jsonData, options: [])

我尝试执行上述操作,得到以下输出:


    data =     
        text = Test Message;
    ;
    recipients = "system1@example.com";
    sender = "system2@example.com";

然而 websocket 期望这样:

 "sender":"system1@example.com","recipients":
["system2@example.com"],"data":"text":"Test Message"

即使有轻微的变化,例如双引号的错位,websocket 服务器也不接受输入。这种方式如何准确格式化JS,让websocket可以接受?

【问题讨论】:

你问的是不必要的东西,其实 Dictionary 本身就是一个 JSON ,你可以直接传递 Data object ,如果你把那个东西作为字符串传递那么你只需要将数据转换为字符串跨度> 不相关,但您确定要 ASCII 编码而不是 UTF-8? 是的,应该是UTF-8。感谢您指出! @JonSnow 问题是我正在 ping 的 websocket,需要我上面提到的某种格式的数据。任何变化和套接字不考虑输入。 "如何在没有 /n 和其他空格的情况下以普通 JSON 格式获取输出?" ... 不要使用 .prettyPrinted 选项,这是插入 \n 和其他空格的原因。话虽如此,JSON Web 服务并不关心换行符和空格是否存在。这看起来很奇怪,因为 JSON 是可选的,而您没有打开它。如果你打开它并打印它,它看起来会很好,并且可以被 Web 服务直接使用。 【参考方案1】:

在尝试了各种方法后,下面的方法对我来说是获得后端所需的确切格式的方法。

var messageDictionary = [
    "sender":"system1@example.com",
    "recipients":[
        "system2@example.com"
    ],
    "data":[
        "text" : data
    ]
] as [String : Any]

let jsonData = try! JSONSerialization.data(withJSONObject: messageDictionary)
let jsonString = NSString(data: jsonData, encoding: String.Encoding.utf8.rawValue)

【讨论】:

【参考方案2】:

此外,您可以只转换为字符串

let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
let jsonString = String(data: jsonData!, encoding: .utf8)

【讨论】:

【参考方案3】:

现在 JSONEncoder 可以轻松完成这项工作。

let encoder = JSONEncoder()

encoder.outputFormatting = .prettyPrinted

let data = try encoder.encode(yourDictionary)

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

【讨论】:

以上是关于如何从 Swift 4 中的字典创建 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何从 json 动态创建字典?

Swift 4中的JSON字符串到字典

Swift - 从字典(或者Alamofire)直接创建Model文件的工具

Swift - 从模型中的 API 调用返回 JSON 对象作为字典以在视图控制器中使用

将 SWIFT 字典替换为 JSON 对象

如何在 Swift 中将数组添加到我的 JSON 字典