首页 > 解决方案 > Json字符串转换

问题描述

我有一个 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 周围的对象格式错误。}

标签: ios

解决方案


请阅读错误信息并检查字符 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)

推荐阅读