【问题标题】:JSON Parsing---> Could not cast value of type '__NSCFString' (0x1e5c38f90) to 'NSDictionary' (0x1e5c39bc0)JSON 解析---> 无法将类型“__NSCFString”(0x1e5c38f90)的值转换为“NSDictionary”(0x1e5c39bc0)
【发布时间】:2019-05-13 09:46:16
【问题描述】:
{"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}]

如何在此词典中打印状态值?提前致谢。

【问题讨论】:

标签: ios swift swift4 nsjsonserialization


【解决方案1】:

两个主要问题:

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

【讨论】:

    【解决方案2】:

    jsonDict["value"] 是 json 字符串而不是字典

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

    【讨论】:

    • 保留您的代码后,我得到了这个异常我该如何修复这里--> 线程 1:致命错误:“尝试!”表达式意外引发错误:错误域 = NSCocoaErrorDomain 代码 = 3840“字符 1 周围的对象中的值没有字符串键。” UserInfo={NSDebugDescription=对象中字符 1 周围的值没有字符串键。}
    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 2020-08-23
    • 2015-10-26
    • 1970-01-01
    • 2017-11-22
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多