1

以下のように、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"}
4

2 に答える 2

1

実際の問題は、サーバーからのJsonエンコードされたデータが文字列として来ていたことでした

方法 1: ソリューションへのリンクを提供する Eric D の提案 JSON 文字列の 2D 配列から値を取得する

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

方法2:私自身のハードな回避策:-(

文字列データを配列[文字列: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]
于 2016-07-01T12:52:42.203 に答える
0

3 番目のアプローチでは、JsnAryVar型を Dictionary ( [String: AnyObject]) に設定し、結果を Dictionary にキャストしJSONObjectWithDataます。

次のとおりです。

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

MsgKeyこれで、 のように Dictionary として内部の要素にアクセスできますJsnAryVar["NamKey"]

于 2016-06-30T21:19:05.350 に答える