Ios JSON解析-->;无法强制转换类型为'__NSCFString';(0x1e5c38f90)至';NSDictionary';(0x1e5c39bc0)

Ios JSON解析-->;无法强制转换类型为'__NSCFString';(0x1e5c38f90)至';NSDictionary';(0x1e5c39bc0),ios,swift,swift4,nsjsonserialization,Ios,Swift,Swift4,Nsjsonserialization,我以字符串格式获取上面的json数据,并使用JSONSerialization进行解析,就像下面的方法一样。我可以在控制台中打印值数据,但如何基于键访问内部值 {"msgType":"UPDATE_S","macAddress":"2F-01-01-01-01-01","deviceName":"vMining","deviceType":"vSensor","groupId":"vMiningYo","param”:”truckDetail","value":"[{'TruckNo':1,'S

我以字符串格式获取上面的json数据,并使用
JSONSerialization
进行解析,就像下面的方法一样。我可以在控制台中打印值数据,但如何基于键访问内部值

{"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"}
在控制台中打印:

    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)
        //            }
    }
}
如何打印此词典中的状态值?提前感谢。

jsonDict[“value”]
是一个json字符串,而不是字典

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}]

有两个主要问题:

  • key
    value
    的对象是一个
    字符串(显然是JSON)。错误清楚地表明了这一点
  • 但实际上它不是有效的JSON,因为JSON字符串必须用双引号包装,不支持单引号
  • 您需要另外两个步骤:用双引号替换单引号,并分别反序列化JSON字符串

    对象是一个数组。使用循环或按索引获取项

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

    重复的。@wings基于此答案,我无法按要求进行更改。您能建议我如何修复它吗?保留代码后,我遇到此异常,我如何在此处修复-->线程1:致命错误:“重试!”表达式意外引发错误:error Domain=NSCOCAERRORDOMAIN Code=3840“字符1周围的对象中的值没有字符串键。”UserInfo={NSDEBUGSCRIPTION=字符1周围的对象中的值没有字符串键。}
    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)}