JSONDecoder - “预期解码 Dictionary<String, Any> 但找到了一个字符串/数据。”

Posted

技术标签:

【中文标题】JSONDecoder - “预期解码 Dictionary<String, Any> 但找到了一个字符串/数据。”【英文标题】:JSONDecoder - "Expected to decode Dictionary<String, Any> but found a string/data instead." 【发布时间】:2018-08-27 11:45:37 【问题描述】:

所以我试图解码一个 json 并得到这个错误。

这是 JSON:

 "SERVERWebSystemInfoGet":  
        "Return Code" : 0,
        "Return String" : "No Error",
        "Info" : "\"IT\":\"IT109200310_0\",\"MAC\":\"00:40:7F:41:F8:81\",\"UUID\":\"uuid:858fba00-d3a0-11dd-a001-00407f41f881\",\"SN\":\"ENG031\",\"ModelNumber\":\"DH-390 2MP\",\"ModelName\":\"DH-390 2MP\",\"FwVer\":\"v1.0.0.34\",\"HwVer\":\"\",\"FriendlyName\":\"DH-390 2MP ENG031\",\"UpTime\":548" 

这是我的模型:

struct Information: Codable 

    let ModelName : String?



struct GetInformation: Codable 

    let Info: [String: Information]?



struct WebSystemInfo: Codable 

    let SERVERWebSystemInfoGet: GetInformation?


这是方法:

func parseGetInfo(data: Data) 

    do 
        let info = try JSONDecoder().decode(WebSystemInfo.self, from: data)
        print(info)
     catch let error
        print(error)
    

这是我得到的错误:

typeMismatch(Swift.Dictionary Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "SERVERWebSystemInfoGet", intValue: nil), CodingKeys(stringValue: "Info", intValue: nil)], debugDescription: "期望解码 Dictionary 但找到了一个字符串/数据。",底层错误: nil))

【问题讨论】:

请学会理解解码错误信息,它们非常具有描述性。错误表示您要解码字典,但实际对象是字符串 (Info)。 【参考方案1】:

这个

 "Info" : "\"IT\":\"IT109200310_0\",\"MAC\":\"00:40:7F:41:F8:81\",\"UUID\":\"uuid:858fba00-d3a0-11dd-a001-00407f41f881\",\"SN\":\"ENG031\",\"ModelNumber\":\"DH-390 2MP\",\"ModelName\":\"DH-390 2MP\",\"FwVer\":\"v1.0.0.34\",\"HwVer\":\"\",\"FriendlyName\":\"DH-390 2MP ENG031\",\"UpTime\":548" 

是一个json字符串而不是你需要的字典

let Info:String?

【讨论】:

知道如何从结果中获取值吗?例如我想要 UUID 值 要么更改服务器对字典的响应,要么查看此***.com/questions/25621120/… ,,,,,,,,,, ***.com/a/42380140/5820010【参考方案2】:

这是因为Info 值实际上是一个字符串而不是字典。 请注意,它以引号开头。

更改模型以返回 Dictionary 而不是 String。

【讨论】:

【参考方案3】:

您复制了带有转义位的 JSON:\”,这使得信息字典成为字符串。

试试下面去掉转义的字符串是否可以解码。


  "SERVERWebSystemInfoGet": 
    "Return Code": 0,
    "Return String": "No Error",
    "Info": 
        "IT": "IT109200310_0",
        "MAC": "00:40:7F:41:F8:81",
        "UUID": "uuid:858fba00-d3a0-11dd-a001-00407f41f881",
        "SN":"ENG031",
        "ModelNumber": "DH-390 2MP",
        "ModelName": "DH-390 2MP",
        "FwVer": "v1.0.0.34",
        "HwVer": "x",
        "FriendlyName": "DH-390 2MP ENG031",
        "UpTime": "548"
    
  

然后您可以考虑更改服务器输出,或者如果您不能按照this guide 手动解码info,它从手动编码和解码开始,重要的是位。

【讨论】:

以上是关于JSONDecoder - “预期解码 Dictionary<String, Any> 但找到了一个字符串/数据。”的主要内容,如果未能解决你的问题,请参考以下文章

重用 JSONDecoder 或在每个请求上重新创建它?

使用 JSONDecoder 和可编码协议的网络

如何使用 JSONDecoder 根据订单键获取排序数据?

使用 JSONDecoder 解码 [[String]]?

JSONDecoder 找不到存在的密钥

使用 JSONDecoder 解码古怪的日期格式