【问题标题】:iOS - NSJSONSerializer parsing error for JSON ArraysiOS - JSON 数组的 NSJSONSerializer 解析错误
【发布时间】:2014-08-27 11:57:34
【问题描述】:

我正在使用 AFNetworking 2.0 调用 REST API,并返回一个有效的 JSONArray,例如:

[{"myattr": "asdf"}, {"myattr": "jklo"}]

我用这个位置解析我的responseObject

NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: responseObject options: NSJSONReadingMutableContainers error: &e];

奇怪的是我的jSONArray(在调试器中查找)包含两个对象,但序列化程序会引发解析错误。发生的情况是一些内部对象属性被剥离了它们的刻度。所以例如我看到:

[{attr: "asdf", attr2: "jklo", "attr3": "tzze"}, ...]

奇怪的是,一些属性保持它们的滴答声!

毕竟我唯一的想法是(除了这整个事情是错误的)序列化程序不会预期 JSONArray 而是 JSONObject

这是我的全部代码:

    [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        int statusCode = [operation.response statusCode];


        NSError *e = nil;
//        NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: responseObject options: NSJSONReadingMutableContainers error: &e];
        NSArray *jsonArray = (NSArray *)responseObject;

        NSLog(responseObject);
        NSLog(jsonArray);

        NSDictionary *testDic = (NSDictionary *)jsonArray[0];
        [testDic objectForKey:@"name"];

        if (!jsonArray) {
            NSLog(@"Error parsing JSON: %@", e);
        } else {
            for(NSDictionary *item in jsonArray) {
                NSLog(@"Item: %@", item);
            }
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

所以,毕竟我只是在寻找解析我的JSONArray 的解决方案。 我查看了hereherehere,但没有找到解决方案。 ..

谢谢!

编辑

这里是解析错误:

(<invalid>) <error: expected ']' error: 1 errors parsing expression

【问题讨论】:

  • 你遇到了什么错误?
  • 错误是什么?? error: 参数的存在是有原因的。
  • 第一个 NSLog 的输出在哪里??
  • -1 未能包含 NSLog 输出。
  • NSError 未设置,jsonArray 变量也未设置。我用我得到的解析错误更新了我的帖子。

标签: ios json rest afnetworking-2 arrays


【解决方案1】:

您不必序列化该响应,因为它已经序列化。 Afnetworking 库在内部做所有这些事情。只需使用

NSArray *jsonArray = (NSArray *)responseObject;

不是

NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: responseObject options: NSJSONReadingMutableContainers error: &e];

编辑

访问内部值,例如访问asdf。其他人也一样。

NSDictionary *testDic = (NSDictionary *)jsonArray[0];
[testDic objectForKey:@"myattr"];

【讨论】:

  • 谢谢,但是如何访问我的内部 json 对象?
  • 抱歉,我收到了-[_NSInlineData objectAtIndexedSubscript:]: unrecognized selector sent to instance 0x15d63440
  • 当我尝试这个时jsonArray[0][@"myattr"];
  • @Ale 现在尝试编辑的答案。我也使用相同的代码,它在这里工作。可能你正在使用旧的 xcode。
  • 抱歉,当我尝试访问 jsonArray[0] 值时出现错误。我使用 xcode 5。
【解决方案2】:

我找到了解决方案。我不知道有什么不同,但现在下面的代码正在运行:

 [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        int statusCode = [operation.response statusCode];
        NSMutableArray *result = [[NSMutableArray alloc]init];

        NSError *e = nil;
        NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: responseObject options:NSJSONReadingMutableContainers error:&e];

        if(!jsonArray) {
           NSLog(@"Error parsing JSON: %@", e);
        }else {
            for(NSDictionary *jsonDict in jsonArray) {

                for (id key in jsonDict) {
                    id value = [jsonDict objectForKey:key];

                    if([key isEqualToString:@"name"]) {
                       //create my object...
                    }
                }
            }
        }

感谢@Yogesh Suthar 的帮助。

【讨论】:

    猜你喜欢
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多