Разбор JSON ---> Не удалось привести значение типа '__NSCFString' (0x1e5c38f90) к 'NSDictionary' (0x1e5c39bc0) - PullRequest
0 голосов
/ 13 мая 2019
{"msgType":"UPDATE_S","macAddress":"2F-01-01-01-01-01","deviceName":"vMining","deviceType":"vSensor","groupId":"vMiningYo","param”:”truckDetail","value":"[{'TruckNo':1,'Status':'Moving to crusher','Speed':0,'CheckPointNumber':16,'CurrentLoad':346,'TirePressureIssueWheelNumber':0,'TirePressure':6,'Longitude':36.835072,'Latitude':-109.059769,'Altitude':1.0}]","valueDimension":"JSON","topic":"in/vMiningYo_ios/vMINING","_MessageGateway_TimeMilliseconds":1557471205646,"_MessageGateway_TimeSeconds":1557471205,"_MessageGateway_TimeISO8601":"2019-05-10T06:53:25.646Z","_MessageGateway_MessageClientType":"WS","_MessageGateway_Topic":"in/vMiningYo_ios/vMINING"}

Я получаю данные выше json в строковом формате и выполняю синтаксический анализ JSONSerialization, как показано ниже.Я могу печатать данные значений в консоли, но как мне получить доступ к внутренним значениям на основе ключей.

    func recieveMessage(json:String){
    guard let data = json.data(using: .utf16),
        let jsonData = try? JSONSerialization.jsonObject(with: data),
        let jsonDict = jsonData as? [String: Any],
        let param = jsonDict["param"] as? String else {
            return
    }
    if param == "truckDetail"{
        print("VALUE:: \(jsonDict["value"]!)")
        let truckData = jsonDict["value"]! as! [String:Any]
        print(truckData)
        print(truckData["Status"])
        //            if let truckData = jsonDict["value"] as? [String: Any]{
        //                print(truckData)
        //            }
    }
}

Печать в консоли:

VALUE:: [{'TruckNo':1,'Status':'Moving to crusher','Speed':0,'CheckPointNumber':16,'CurrentLoad':346,'TirePressureIssueWheelNumber':0,'TirePressure':6,'Longitude':36.835072,'Latitude':-109.059769,'Altitude':1.0}]

Как можно распечатать значение состояния в этомТолковый словарь?Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Есть две основные проблемы:

  1. Объект для ключа value - это String (очевидно, JSON).Это то, что ясно говорит ошибка.
  2. Но на самом деле это недопустимый JSON, потому что строки JSON должны быть заключены в двойные кавычки, одинарные кавычки не поддерживаются.

Вам необходимо выполнить два дополнительных шага:Замените одинарные кавычки на двойные и десериализуйте строку JSON отдельно.

И объект является массивом.Или используйте цикл или получите элемент по индексу

let json = """
{"msgType":"UPDATE_S","macAddress":"2F-01-01-01-01-01","deviceName":"vMining","deviceType":"vSensor","groupId":"vMiningYo","param":"truckDetail","value":"[{'TruckNo':1,'Status':'Moving to crusher','Speed':0,'CheckPointNumber':16,'CurrentLoad':346,'TirePressureIssueWheelNumber':0,'TirePressure':6,'Longitude':36.835072,'Latitude':-109.059769,'Altitude':1.0}]","valueDimension":"JSON","topic":"in/vMiningYo_ios/vMINING","_MessageGateway_TimeMilliseconds":1557471205646,"_MessageGateway_TimeSeconds":1557471205,"_MessageGateway_TimeISO8601":"2019-05-10T06:53:25.646Z","_MessageGateway_MessageClientType":"WS","_MessageGateway_Topic":"in/vMiningYo_ios/vMINING"}
"""

let data = Data(json.utf8)
do {
    if let result = try JSONSerialization.jsonObject(with: data) as? [String:Any],
       let param = result["param"] as? String {
       if param == "truckDetail" {
           let value = result["value"] as! String
           let valueString = value.replacingOccurrences(of: "\'", with: "\"")
           let valueData = Data(valueString.utf8)
           if let valueResult = try JSONSerialization.jsonObject(with: valueData) as? [[String:Any]] {
              for item in valueResult {
                   print(item["Status"] as? String ?? "n/a")
              }
           }
       }
    }
} catch { print(error)}
1 голос
/ 13 мая 2019

jsonDict["value"] это строка json, а не словарь

let truckStr = jsonDict["value"] as! String
let jsonDic = try! JSONSerialization.jsonObject(with:Data(truckStr.utf8)) as! [String: Any] 
print(jsonDic["Status"])
...