【问题标题】:dictionary automatically adding backslash \ in swift字典在swift中自动添加反斜杠\
【发布时间】:2020-07-27 11:43:48
【问题描述】:

我尝试将 json 放入字典中,以便使用 alamofire 将该字典发送到服务器

我制作了 json 字符串,但是当我把它放在字典里时

字典自动将“\”添加到我的 jsonstring 中!

我该怎么办?

这是我的:



internal var registers : [  [String:String]  ] = []

registers.append(["fullName" :"ali","mid" :"406070","phoneNumber":"0912033"])

let jsonData = try! JSONEncoder().encode(registers)
let jsonString = String(data: jsonData, encoding: .utf8)!
let regjson = jsonString

let parameters: [String: String] = [
    "registers": regjson

   ]

结果是

["registers": "[{\"mid\":\"406070\",\"fullName\":\"ali\",\"phoneNumber\":\"0912033\"}]"]

应该是这样的

["registers": [{"fullName":"ali","mid":"406070","phoneNumber":"0912033"}]]

【问题讨论】:

  • 这只是你打印一个String的结果,实际值不包含反斜杠。
  • 但服务器响应“消息”:“位置 2 的 JSON 中的意外令牌 \\”我应该删除那些 @DávidPásztor
  • let parameters: [String: String] = ["registers": regjson] => let parameters: [String: String] = ["registers": registers]。因为您是键 registers 的字符串化 JSON,而 JSON 目标中的情况并非如此。

标签: json swift dictionary alamofire


【解决方案1】:

您正在使用字典,将其编码为 JSON 字符串。该过程运行良好。如果您查看regjson,您会发现它很好。自己看:

let registers = [
    ["fullName" :"ali","mid" :"406070","phoneNumber":"0912033"]
]

let registersJsonData = try! JSONEncoder().encode(registers)
let registersJsonString = String(data: registersJsonData, encoding: .utf8)!
print(registersJsonString) // Looks just fine.
// => [{"mid":"406070","fullName":"ali","phoneNumber":"0912033"}]

但是您随后将这个 json 字符串放入另一个字典,并将整个内容重新序列化为另一个 json 字符串。系统不知道键 "registers" 的字符串值已经是 JSON 序列化字符串。它认为这是一个普通字符串,与"Mary had a little lamb." 之类的没有什么不同。它序列化这个字符串,就像任何其他字符串一样。这样做涉及转义在 JSON 语法中具有其他含义的符号。

系统运行正常,你只是要求它做一些你不想要的事情。

您可能正在寻找的是:

let registers = [
    ["fullName": "ali", "mid" :"406070", "phoneNumber": "0912033"]
]

let parameters = [
    "registers": registers
]


let parametersJsonData = try! JSONEncoder().encode(parameters)
let parametersJsonString = String(data: parametersJsonData, encoding: .utf8)!
print(parametersJsonString)
// => {"registers":[{"phoneNumber":"0912033","mid":"406070","fullName":"ali"}]}

【讨论】:

    【解决方案2】:

    我该怎么办?

    没什么,反斜杠是虚拟的。添加它们以在文字字符串中显示双引号。

    【讨论】:

    • 但服务器无法解析反斜杠并响应错误
    • 你确定服务器需要一个带有 JSON 字符串值的字典吗?
    • @vadian 是的服务器需要 jsonstring
    • 您不发送 JSON 字符串。您发送带有 String 键和 JSON 字符串值的字典,这很不寻常。
    • @SeyedAliShahrokhi 你不明白,你在拿一本字典,把它编码成一个 JSON 字符串。该过程运行良好。如果您查看regjson,您会发现它很好。但是您随后将获取此 json 字符串,并放入另一个字典,并将该字典重新序列化为另一个 json 字符串。这样做需要转义特殊符号。
    【解决方案3】:

    您可能正在打印一个可选字符串。因此终端将 JSON 字符串显示为子字符串,从而打印换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-29
      • 2016-11-27
      • 2017-11-26
      • 2015-10-23
      • 2020-10-05
      • 2019-12-23
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多