JSONDecoder - «Ожидается декодировать словарь <String, Any>, но вместо этого найдена строка / данные». - PullRequest
0 голосов
/ 27 августа 2018

Итак, я пытаюсь декодировать 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: «Ожидается, что будет декодирован словарь, но вместо него найдена строка / данные», underError: nil))

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

* Это * 1001

 "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?
0 голосов
/ 27 августа 2018

Вы скопировали 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"
    }
  }
}

Тогда вы можете подумать об изменении выхода сервера, если можете, или о ручном декодировании info, если не можете, следуя этому руководству , оно начинается с Ручное кодирование и декодирование с важными битами.

0 голосов
/ 27 августа 2018

Это происходит потому, что значение Info на самом деле является строкой, а не словарем. Обратите внимание, что он начинается с кавычек.

Измените модель, чтобы она возвращала словарь вместо строки.

...