【问题标题】:Json String conversionJson字符串转换
【发布时间】:2021-01-30 09:20:19
【问题描述】:

我有一个 json 字符串。但我无法将其更改为 Dictionary String:Any 。谁能帮帮我?

这是我的代码

var str = "{\"01-2021\":\"[\"01 06 2021\",\"01 07 2021\",\"01 13 2021\",\"01 14 2021\",\"01 20 2021\",\"01 21 2021\",\"01 27 2021\",\"01 28 2021\"]\",\"02-2021\":\"[\"02 03 2021\",\"02 04 2021\",\"02 10 2021\",\"02 11 2021\",\"02 17 2021\",\"02 18 2021\",\"02 24 2021\",\"02 25 2021\"]\"}"

let data = string.data(using: .utf8)!


do {
    if let jsonArray = try JSONSerialization.jsonObject(with: data, options : .fragmentsAllowed) as? [String: Any]
    {
        print(jsonArray) // use the json here
    } else {
        print("bad json")
    }
} catch let error as NSError {
    print(error)
}

我总是收到这样的错误:Error Domain=NSCocoaErrorDomain Code=3840“字符 14 周围的对象格式错误。” UserInfo={NSDebugDescription=字符 14 周围的对象格式错误。}

【问题讨论】:

  • 我想转换成字典,例如 ["01-2021" : "["01 06 2021","01 07 2021","01 13 2021","01 14 2021","01 20 2021","01 21 2021","01 27 2021","01 28 2021"]", [02-2021" : "["02 03 2021","02 04 2021","02 10 2021", "02 11 2021","02 17 2021","02 18 2021","02 24 2021","02 25 2021"]"]

标签: ios


【解决方案1】:

请阅读错误信息并检查 14 是什么字符?第一个冒号后的(转义)双引号是冒号前的(转义)双引号的结束双引号。这是无效的语法。您的 JSON 字符串是损坏的 [String:String] 字典。

文字字符串语法更清晰

let str = """
{"01-2021":"["01 06 2021","01 07 2021","01 13 2021","01 14 2021","01 20 2021","01 21 2021","01 27 2021","01 28 2021"]","02-2021":"["02 03 2021","02 04 2021","02 10 2021","02 11 2021","02 17 2021","02 18 2021","02 24 2021","02 25 2021"]"}
"""

左方括号"[" 是字符串文字,后面的0 无效。


如果你想要[String:String] 它应该是

let str = """
{"01-2021":"[\\\"01 06 2021\\\",\\\"01 07 2021\\\",\\\"01 13 2021\\\",\\\"01 14 2021\\\",\\\"01 20 2021\\\",\\\"01 21 2021\\\",\\\"01 27 2021\\\",\\\"01 28 2021\\\"]","02-2021":"[\\\"02 03 2021\\\",\\\"02 04 2021\\\",\\\"02 10 2021\\\",\\\"02 11 2021\\\",\\\"02 17 2021\\\",\\\"02 18 2021\\\",\\\"02 24 2021\\\",\\\"02 25 2021\\\"]"}
"""

如果你想要[String:Any] 实际上是[String:[String]] 它是

let str = """
{"01-2021":["01 06 2021","01 07 2021","01 13 2021","01 14 2021","01 20 2021","01 21 2021","01 27 2021","01 28 2021"],"02-2021":["02 03 2021","02 04 2021","02 10 2021","02 11 2021","02 17 2021","02 18 2021","02 24 2021","02 25 2021"]}
"""

在任何情况下,.allowFragments 选项都是毫无意义的


编辑:修复损坏的 JSON 替换

let data = string.data(using: .utf8)!

let data = Data(str.replacingOccurrences(of: "\"[", with: "[").replacingOccurrences(of: "]\"", with: "]").utf8)

let data = Data(str.replacingOccurrences(of: #""["#, with: "[").replacingOccurrences(of: #"]""#, with: "]").utf8)

【讨论】:

  • 非常感谢。
  • 但字符串是从 api 解析中获取的。您能否帮我用 [ 替换 "[ 。因为当我不能使用 str.replacingOccurrences(of: "["", with: "[") 时。因为 "["" 无效
  • 你确定,这正是你得到的字符串吗?使用 String(data: data, encoding: .utf8) 从原始数据创建一个字符串并打印它。
  • 是的,这是字符串,是文档后端团队给我的示例(也是我从 api 获得的)。
  • 如果有文档后端团队,告诉他们发送一致的数据。并且 never 将(嵌套的)JSON 字符串作为字典值发送。替换字符不是解决办法
【解决方案2】:

这是正确的格式,

{
  "01-2021":[
    "01 06 2021",
    "01 07 2021",
    "01 13 2021",
    "01 14 2021",
    "01 20 2021",
    "01 21 2021",
    "01 27 2021",
    "01 28 2021"
  ],
  "02-2021":[
    "02 03 2021",
    "02 04 2021",
    "02 10 2021",
    "02 11 2021",
    "02 17 2021",
    "02 18 2021",
    "02 24 2021",
    "02 25 2021"
  ]
}

哦,如果你想检查 json 格式是否正确,你可以访问这个链接 https://jsonformatter.curiousconcept.com/#

【讨论】:

  • 谢谢。只是因为我从 api 得到这个字符串。我需要更正它以解析为字典
猜你喜欢
  • 2018-06-28
  • 2012-10-26
  • 2011-06-28
  • 2012-10-06
  • 1970-01-01
  • 2015-12-26
  • 2019-07-25
  • 2015-11-19
相关资源
最近更新 更多