JSONDecoder-“预期对Dictionary <string,any =“”>进行解码,但找到了一个字符串/数据。

时间:2018-08-27 11:45:37

标签: ios swift decode jsondecoder

所以我正在尝试解码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))

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

 "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?

答案 2 :(得分:1)

您复制了带有转义位的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,则从手动编码和解码具有重要意义。