在 Swift 中创建 JSON 字符串

Posted

技术标签:

【中文标题】在 Swift 中创建 JSON 字符串【英文标题】:Create a JSON String in Swift 【发布时间】:2017-03-16 16:06:43 【问题描述】:

我将文本从 TextView 发送到我的后端。为了包含换行符,我尝试将 textView.text 序列化为 JSON。

let jsonObject: NSMutableDictionary = NSMutableDictionary()

    jsonObject.setValue(textView.text, forKey: "text")

    let jsonData: NSData

    do 
        jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: JSONSerialization.WritingOptions()) as NSData
        let jsonString = NSString(data: jsonData as Data, encoding: String.Encoding.utf8.rawValue) as! String
        print(jsonString)

     catch _ 
        print ("JSON Failure")
    

    

但由于这是一个字典,因此生成的文本如下所示: "text":"test\nstack\n\noverflow"

我实际上只需要:test\nstack\n\noverflow

有没有一种漂亮的方法可以快速转换多行字符串以使这些“\n”用于换行符而无需任何额外字符?

编辑:

我希望在我的 textView 中输入如下内容:

结果得到字符串“hello\n\n”

源码如下:

let text = textView.text
        let components = text?.components(separatedBy: CharacterSet.newlines).filter(!$0.isEmpty)
        let textWithLineFeeds = components?.joined(separator:"\n")

        print(textWithLineFeeds!)
        print(textView.text)

第一个打印给出: 测试 你好 上面的换行符

第二个打印语句: 测试 你好

上面的换行符

我希望我能看到: 测试\n你好\n\n上面的换行符

【问题讨论】:

为什么不在后端反序列化 JSON 并从 "text" 键中获取文本值? :) 不是我的后端,只是我必须开发的后端。我可以使用 textview.text.debugdescription 并修剪第一个和最后一个字符,但我不想使用 hacky 解决方案。 我不明白。后端不理解 JSON,因为您正在发送 JSON?如果后端不理解 JSON,只需发送一个字符串而不是 JSON...请解释一下,我没有理解您为什么不能发送您的 JSON 对象。 如果你只想发送字符串,为什么要序列化字符串呢?单个 JSON 字符串等于标准字符串。但是,建议使用数组或字典作为根对象发送 JSON。并且从不在 Swift 中使用 NSMutableArray / NSMutableDictionary 我向后端发送一个带有以下标头的 json,让 headers2: HTTPHeaders = [ "sid": sid, "receiver": guid, "message": message, "latestmessage": "0 " ],如果消息字符串包含换行符,它不会接受它。它需要 \n 来处理换行符。这就是为什么我试图通过 json 序列化来实现这一点。我只想用 \n 填充换行符并避免任何额外的字符。 【参考方案1】:

要将带有任意换行符(CR、LF、CRLF 等)的文本转换为不同的 - 仅 LF - 换行符,请使用:

let text = "test\r\nstack\n\noverflow\rfoo"
let components = text.components(separatedBy: CharacterSet.newlines).filter(!$0.isEmpty)
let textWithLineFeeds = components.joined(separator:"\n")

如果服务器只接受 CR,请将 \n 更改为 \r

【讨论】:

您的答案将“test\r\nstack\n\noverflow\rfoo”转换为测试堆栈溢出,但我需要它完全相反的方式。 代码将任意换行符替换为\n。我不明白您的问题中的 line break 是什么。请添加来源和预期结果。 我编辑了问题以澄清我在寻找什么。 @JochenÖsterreicher 对不起,Jochen,来源只是一个截图。它没有显示如何处理换行符。请从文本视图/标签中获取文本并打印。 let str = textView.text.debugDescription let start = str.index(str.startIndex, offsetBy: 1) let end = str.index(str.endIndex, offsetBy: -1) let range = start..

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

为啥在 swift 中创建字符串时会出现内存泄漏?

如何从模型数据 Swift 创建 JSON 字符串? [关闭]

在 Swift-Json 中创建 NSMutableDictionary

在 Swift 中创建 UITextFieldDelegate 以限制字符数

如何在 Swift 中创建范围?

如何在 Swift 中创建十六进制颜色字符串 UIColor 初始化程序? [复制]