【问题标题】:Ios Swift decode json data sent from GCM notificationIos Swift 解码从 GCM 通知发送的 json 数据
【发布时间】:2016-11-03 03:20:13
【问题描述】:

我正在接收 GCM Json 编码的数据作为 AnyObject,如下所示

[MsgKey: {"NamKey":"Bdy","MobKey":"9964120147","UidKey":"Uid31"}, collapse_key: do_not_collapse, from: 925652137353]

我想将上面的内容解码并传递到本地通知屏幕

我在下面尝试过:

func application(appPsgVar: UIApplication,
                 didReceiveRemoteNotification userInfo: [NSObject : AnyObject])
{
    print("Notification: ",userInfo["MsgKey"]!)

    let MsgVar = userInfo["MsgKey"]

    var GotVar = MsgVar?.objectAtIndex(2)
|Or|
    var GotVar = MsgVar?.objectForKey("UidKey")
|Or|
    var GotVar = MsgVar?.valueForKey("UidKey")

    if let MsgVar = userInfo["MsgKey"] as? [String:AnyObject]
    {
        GetNfnFnc(MsgVar["NamKey"] as! String)
    }

    if let MsgVar = userInfo["MsgKey"] as? NSData
    {
        var JsnAryVar: AnyObject!
        do
        {
            JsnAryVar = try NSJSONSerialization.JSONObjectWithData(MsgVar, options: [])
            print(JsnAryVar)
        }
        catch
        {
            print("ErrVar")
        }

        GetNfnFnc(JsnAryVar["NamKey"] as! String)
    }
}

userInfo["MsgKey"] 给了我以下数据,但无法理解如何进一步解码

{"NamKey":"Bdy","MobKey":"9964120147","UidKey":"Uid31"}

【问题讨论】:

    标签: ios json swift2 google-cloud-messaging anyobject


    【解决方案1】:

    实际问题是来自服务器的 Json 编码数据以字符串形式出现

    方法 1:由 Eric D 建议提供解决方案链接 Retrieving values from 2D array in JSON string

    do
    {
        if let MsgCodVar = MsgSrgVar.dataUsingEncoding(NSUTF8StringEncoding),
         let MsgJsnVar = try! NSJSONSerialization.JSONObjectWithData(MsgCodVar, options: []) as? [String:AnyObject]
        {
            print(MsgJsnVar)
        }
    }
    

    方法2:我自己的努力解决方法:-(

    创建自己的函数将字符串数据转换为数组[String:AnyObject]

    func CnvJsnSrgTooAryFnc(JsnSrgPsgVar: String) -> [String:AnyObject]
    {
        var JsnSrgVar = JsnSrgPsgVar
        JsnSrgVar = JsnSrgVar.stringByReplacingOccurrencesOfString("\"", withString: "")
        JsnSrgVar = JsnSrgVar.stringByReplacingOccurrencesOfString("{", withString: "")
        JsnSrgVar = JsnSrgVar.stringByReplacingOccurrencesOfString("}", withString: "")
        let SrgAryVar = JsnSrgVar.componentsSeparatedByString(",")
    
        var JsnAryVar = [String:AnyObject]()
        for SrgIdxVar in SrgAryVar
        {
            let SrgIdxAryVar = SrgIdxVar.componentsSeparatedByString(":")
            JsnAryVar[SrgIdxAryVar[0]] = SrgIdxAryVar[1]
        }
        return JsnAryVar
    }
    
    let MsgAryVar = CnvJsnSrgTooAryFnc(MsgSrgVar)
    
    MsgAryVar["UidKey"]
    

    得到输出:

    print(MsgSrgVar) :
    {"NamKey":"Bdy","MobKey":"9964120147","UidKey":"Uid99"}
    
    print(MsgAryVar)
    ["NamKey": Bdy, "MobKey": 9964120147, "UidKey": Uid99]
    

    【讨论】:

    • 这不是解决您问题的好方法。您应该对 JSON 字符串使用 NSJSONSerialization。示例:stackoverflow.com/a/34830341/2227743
    • 谢谢,我正在尝试这样简单的解决方案。对我帮助很大。
    【解决方案2】:

    在您的第三种方法中,将 JsnAryVar 类型设置为 Dictionary ([String: AnyObject]) 并将 JSONObjectWithData 的结果转换为 Dictionary。

    关注:

    var JsnAryVar: [String: AnyObject]!
    JsnAryVar = try NSJSONSerialization.JSONObjectWithData(MsgVar, options: []) as! [String: AnyObject]
    

    现在,您可以将 MsgKey 中的元素作为字典访问,例如 JsnAryVar["NamKey"]

    【讨论】:

    • 第三种情况的问题是, 是假的,永远不会进去
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多