如何编码json响应并将其写入数组?

Posted

技术标签:

【中文标题】如何编码json响应并将其写入数组?【英文标题】:How to encode json response and write it in array? 【发布时间】:2013-09-07 16:31:50 【问题描述】:

我正在使用 AFJSONRequestOperation 来获取我的朋友列表。这是请求:

/// get friends
    NSString *str = [NSString stringWithFormat:@"https://api.vk.com/method/friends.get?fields=first_name,last_name&uid=%@&access_token=%@", user_id, secret];
    NSURL *url = [[NSURL alloc] initWithString:str];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 

NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:JSON
                                                           options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
                                                             error:&error];

                    if (! jsonData) 
                        self.friendsList.hidden = YES;
                        NSLog(@"Got an error: %@", error);
                     else 
                        NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
                        NSLog(@"JSON: %@", jsonString);
                    


     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) 
        NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    ];

    [operation start];

NSLog 的输出如下所示:

"response" : [

  "user_id" : 3468700,
  "uid" : 3468700,
  "first_name" : "Юленька",
  "last_name" : "Калюжная",
  "online" : 0
,

  "user_id" : 3870082,
  "uid" : 3870082,
  "first_name" : "Михаил",
  "last_name" : "Халецкий",
  "online" : 0
,

  "user_id" : 4080134,
  "uid" : 4080134,
  "first_name" : "Мария",
  "last_name" : "Караваева",
  "online" : 0
,

  "user_id" : 4943555,
  "uid" : 4943555,
  "first_name" : "Юсёнок",
  "last_name" : "Ларченко",
  "online" : 0
,

  "user_id" : 5012692,
  "uid" : 5012692,
  "first_name" : "Вячеслав",
  "last_name" : "Тарабушкин",
  "online" : 0
,

  "user_id" : 5036666,
  "uid" : 5036666,
  "first_name" : "Владислав",
  "last_name" : "Растегаев",
  "online" : 0

问题是 json 响应是一行,我无法处理大量的元素。有没有机会将json响应变成一个巨大的?我试过替换

 NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; for 

 NSArray *ar = [[NSArray alloc] initWithObjects:jsonData, nil];

结果 NSLog 显示如下:

 (<7b0a2020 22726573 706f6e73 6522203a 205b0a20 2020207b 0a202020 20202022 75736572          5f696422 203a2033 34363837 30302c0a 20202020 20202275 69642220 3a203334 36383730 302c0a20 20202020 20226669 7273745f 6e616d65 22203a20 22d0aed0 bbd0b5d0 bdd18cd0 bad0b022 2c0a2020 20202020 226c6173 745f6e61 6d652220 3a2022d0 9ad0b0d0 bbd18ed0 b6d0bdd0 b0d18f22 2c0a2020 20202020 226f6e6c 696e6522 203a2030 0a202020 207d2c0a 20202020 7b0a2020 20202020 22757365 725f6964 22203a20 33383730 3038322c 0a202020 20202022 75696422 203a2033 38373030 38322c0a>)

我也试过这个变种:

  NSArray *dataDictionary = [NSJSONSerialization JSONObjectWithData:JSON options:0 error:&error];
  NSLog(@"%@", dataDictionary); 

但应用程序往往会因为出现错误而关闭: [__NSCFDictionary bytes]:无法识别的选择器发送到实例 0x7527ad0 任何帮助,将不胜感激。提前致谢

【问题讨论】:

【参考方案1】:

当您使用AFJSONRequestOperation 时,框架会为您完成对JSON 的解析,您只需要知道/检查结果是NSArray 还是NSDictionary,然后适当地访问它。

【讨论】:

它是字典数组,但如果我 NSLog(@"%@", JSON);看起来是这样的: "first_name" = "\U0421\U0430\U0448\U0430"; “姓氏” = “\U042d\U0433\U043b\U0435\U0442”;在线=1; uid = 205826932; "user_id" = 205826932; , 日志显示它的字典(包含一些编码字符串)。 很抱歉我错过了响应 = (first_name; last_name ..., ) 所以它是字典数组。 如何在不改变结构的情况下对这些字符串进行编码? 尝试对字符串进行 URL 解码(当你读出它时,它不会在解析过程中完成)。【参考方案2】:

您需要检查JSON 对象是NSArray 类型的对象还是NSDictionary 类型的对象,如下所示:

if([JSON isKindOfClass:[NSDictionary class]]) 
    // JSON object is NSDictionary type of object.
 else if([JSON isKindOfClass:[NSArray class]]) 
   // JSON object is NSArray type of object.

【讨论】:

我检查过,我的问题是我无法将 json 响应编码为字典或数组。我只能将它编码为字符串,但这没用,因为我无法处理元素。我肯定错过了什么。 您的回复必须以[开头。

以上是关于如何编码json响应并将其写入数组?的主要内容,如果未能解决你的问题,请参考以下文章

在表视图中使用 JSON 编码错误

如何将 json 编码的 PHP 数组转换为 Javascript 中的数组? [复制]

Yii2 - 如何强制响应JSON格式化程序使用对象而不是数组?

如何在 appSettings.json 中硬编码和读取字符串数组?

如何在 javascript 中访问多维 PHP 数组作为 json 编码的变体?

CodeIgniter 在 JSON 响应中返回 HTML