【问题标题】:how to convert NSString into NSDictionary?如何将 NSString 转换为 NSDictionary?
【发布时间】:2015-10-06 06:51:47
【问题描述】:

您好,我是 iOS 新手,所以请帮助我..

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    {

        NSDictionary *segueDictionary = [userInfo valueForKey:@"aps"];
        NSLog(@"%@",userInfo);
        NSString * string=[[NSString alloc]initWithFormat:@"%@",[segueDictionary valueForKey:@"vendor_data"]];}

输出是

{
    aps =     {
        alert = "Get Upto 50% Off ";
        sound = default;
        "vendor_data" =         {
            cat = "Baby & kids";
            "closing_hours" = "09:00 PM";
            latitude = "28.57089323";
            longitude = "77.32666539";
            "offer_desc" = "Get Upto 50% Off On All Kids Clothing.";
            "offer_id" = 1128;

            "offer_in_percentage" = "Get Upto 50% Off ";
            "offer_item_name" = Lilliput;
            "offer_valid_upto" = "2015-10-30";
            "opening_hours" = "10:00 AM";
            "phone_no" = "*********";
            pincode = 0;
            rating = 0;
            "sub_category" = "Clothing,Footwear";
            title = "Offer Of The Day";
            "vendor_address" = "***********";
            "vendor_id" = "lliputkids.com";
            "vendor_location" = "*****";
            "vendor_name" = Lilliput;
            "vendor_type" = shop;
        };
    };
}

这来自推送通知数据

NSString * string = {
cat = "Baby & kids";
"closing_hours" = "09:00 PM";
latitude = "28.57089323";
longitude = "77.32666539";
"offer_desc" = "Get Upto 50% Off On All Kids Clothing.";
"offer_id" = 1128;
"offer_in_percentage" = "Get Upto 50% Off ";
"offer_item_name" = Lilliput;
"offer_valid_upto" = "2015-10-30";
"opening_hours" = "10:00 AM";
"phone_no" = "********";
pincode = 0;
rating = 0;
"sub_category" = "Clothing,Footwear";
title = "Offer Of The Day";
"vendor_address" = "shop.no- 6, sun market";
"vendor_id" = "illiputkids.com";
"vendor_location" = "*******";
"vendor_name" = Lilliput;
"vendor_type" = shop;}

此数据是字符串格式,但我想要字典格式 我正在获取字符串格式的数据。 所以请帮助我 在此先感谢

【问题讨论】:

  • 您从哪个 api 获得这个?请提供。可能是你错过了什么
  • 感谢您的帮助。编辑问题请参阅
  • 请给NSLog(@"%@",userInfo)。
  • 可能是 [segueDictionary valueForKey:@"vendor_data"] 会返回一个字典
  • 得到“userInfo”的值后可以确认

标签: ios objective-c iphone


【解决方案1】:

请检查一下。

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{

    NSDictionary *segueDictionary = [userInfo valueForKey:@"aps"];
    NSLog(@"%@",userInfo);
    NSDictionary *vendorDic = [segueDictionary valueForKey:@"vendor_data"];
    NSString *vedorAddress = [vendorDic valueForKey:@"vendor_address"];
}

注意: 中的 {key:value,key:value} 是字典格式。但值本身可能是字典。即 {key:{key:value},key:{key:value,key:value}}

【讨论】:

  • 因为我确定“vendor_data”返回字典
  • NSLog(@“vedorAddress:%@”, vedorAddress);//shop.no- 6, sun market //你会看到
  • 感谢它的成功......但我现在想要一件事?为什么要投反对票?
  • 因为他们认为这些数据来自网络服务。所以盲目地用“NSJSONSerialization”转换。不幸的是,他们不知道推送通知不会重新调整 NSData,它直接返回 NSDictionary(在您的情况下可能是嵌套字典)。您也可以下载错误答案的投票。接受/赞成写答案。以便其他人可以轻松找到正确答案。我也赞成你,因为你是对的。
  • 你能告诉我黑白“valueForKey”和“valueForKeyPath”的区别
【解决方案2】:

我相信您误解了 JSON 格式。

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

现在如果你遵循 NSLog 语句

NSLog(@"%@",[json objectForKey:@"sub_category"]);

它将为您提供:- 服装、鞋类

【讨论】:

    【解决方案3】:

    didReceivePushNotificationuserInfo 参数返回一个NSDictionary 对象。

    你可以直接用

    获取vendor_data字典
    NSDictionary *vendorDataDictionary = [[userInfo objectForKey:@"aps"] objectForKey:@"vendor_data"];
    

    或带下标

    NSDictionary *vendorDataDictionary = userInfo[@"aps"][@"vendor_data"];
    

    方法valueForKey:是一种特殊的KVC方法。获取 key 对象的标准方法是objectForKey:

    【讨论】:

      【解决方案4】:

      当您发送远程通知时,其有效负载采用 JSON 格式。粗略地解释一下,它只是将所有对象放在字典和数组中,因此您可以在有效负载中拥有清晰的对象层次结构。

      您现在所做的只是将该 JSON 放入一个字符串中,而不是拥有单独的对象(包含对象的数组和字典),而是一个包含所有对象的长字符串。

      您需要执行以下操作

      • 确保在通知负载中发送有效的格式化 JSON。我不知道你是如何发送它的,所以我无法真正帮助你。

      • 收到推送后,您将拥有一个 userInfo 字典,您可以使用 :objectForKey 进行导航。这是您的 JSON,已转换为 Objective-C 对象。

      您应该在字典中看到您的完整结构。具有适当层次结构的对象和键。

      如果您在 aps 键或其他自定义键中看到一个字符串,那么您发送的数据有误

      但是如果你有

      • aps
        • 提醒
        • 留言
        • 声音
      • 您的自定义密钥
        • 自定义对象
          • 另一个自定义子对象

      在您的userInfo 中有这种结构,那么这意味着您可以开始了。在通知处理的第一行使用断点很容易找到,并查看userInfo 中的内容。

      然后只需查看其中的内容并手动获取它,但如果您自己创建了通知负载(您可能已经这样做了),那么您应该知道哪些数组/字典包含哪些对象,然后手动获取它。

      //I'm just giving EXAMPLES : 
      NSDictionary *corePayload = [userInfo objectForKey:@"aps"];
      NSDictinoary *firstLevel = [userInfo objectForKey:@"vendor_data"];
      float latitude = [[firstLevel objectForKey:@"latitude"]floatValue];
      

      这样你就可以获取任何东西。

      请注意,从您显示的内容来看,您的内容格式不正确,有些键有“”,有些没有,这是不正常的。所以我建议你去看看你发送的内容,并仔细按照我的所有步骤进行操作。如果您的第一步不正确,请不要进行下一步;)

      希望你能找到你要找的东西!

      【讨论】:

      • 好!然后你可以将答案标记为正确:) 点击答案分数下的大 V。
      • 但我现在想要一件事?为什么要投票?有什么问题?
      • 我没有对你投反对票,所以我不知道其他人的想法:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多