使用 AFNetworking 解析 JSON

Posted

技术标签:

【中文标题】使用 AFNetworking 解析 JSON【英文标题】:Parsing JSON with AFNetworking 【发布时间】:2016-02-28 19:14:31 【问题描述】:

我正在尝试通过创建 NSDictionary 的子类并添加 getSomeProperty 方法来解析 Objective-C 中的 JSON 页面。我已经能够使用每个 [ 或 之前的 JSON 页面执行此操作,但无法解析以下类型的页面

[        "id":12345,"name":"name1","account_id":10002000015631,
          "start_at":"2015-09-02T20:24:13","enrollments":        
         ["type":"student","role":"enrollment","role_id":821,
         "user_id":10000001736511,"enrollment_state":"active"],"hide_final_grades":false,
         "workflow_state":"available","restrict_enrollments_to_course_dates":false,
         "id":100000055661076,"name":"name2","account_id":100000230095635,
         "start_at":"2015-08-28T21:22:41Z","grading_standard_id":null,"is_public":null,
         "course_code":"name2","default_view":"wiki","enrollment_term_id":10003000007529,"end_at":null,
         "public_syllabus":false,"storage_quota_mb":500,"is_public_to_auth_users":false,
         "apply_assignment_group_weights":false,"calendar":"ics":"https://someurl.ics",
         "enrollments":["type":"student","role":"StudentEnrollment","role_id":821,
         "user_id":10000001736511,"enrollment_state":"active"],"hide_final_grades":false,"
         workflow_state":"available","restrict_enrollments_to_course_dates":false
]

例如对于这个网页http://www.raywenderlich.com/demos/weather_sample/weather.php?format=json 我能够创建方法

- (NSDictionary *)currentCondition

    NSDictionary *dict = self[@"data"];
    NSArray *ar = dict[@"current_condition"];
    return ar[0];

-(NSString*) cloudcover

    return self[@"cloudcover"];

检索字符串@"16"。

如何使用类似的方法从我的第一个示例 JSON 代码中获取 @"name1" 或 id @"12345"?

【问题讨论】:

【参考方案1】:

你有一个字典数组。要拥有一组输出,您可以使用以下方法:

- (NSMutableArray *)getValueString: (NSString*)string fromArray: (NSArray *)inputArray 
NSString *outputString;
NSMutableArray *outputArray = [NSMutableArray new];

for (id dict in inputArray) 
    if ([[dict class] isSubclassOfClass:[NSDictionary class]]) 
        outputString = [dict valueForKey: string];
    
    else 
        outputString = @"Name not found";
    

    if (!(outputString.length > 0)) 
        outputString = @"Name not found";
    

    [outputArray addObject: outputString];


return outputArray;

并使用它来获取名称:

NSArray *resultArray = [self getValueString: @"name" fromArray: inputArray];
NSString *firstName = resultArray[0];

并通过以下方式获取 ID:

NSArray *resultArray = [self getValueString: @"id" fromArray: inputArray];
NSString *firstId = resultArray[0];

【讨论】:

【参考方案2】:

JSON 字符串开头和结尾的[] 表示它是一个数组,所以当你解析 JSON 时,你会得到一个NSArray*,而不是NSDictionary*。数组的第一个元素是一个对象,所以它将是一个NSDictionary*。像这样访问id

  NSNumber* id = self[0][@"id"];

您的currentCondition 似乎是NSDictionary 上的一个类别。如果这是真的并且您希望上面的代码能够工作,您需要将它放在NSArray 的类别中。如果不是真的,没有更多信息,我不明白self 是什么。

【讨论】:

以上是关于使用 AFNetworking 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 解析 XML

使用 AFNetworking 2.0 异常解析 JSON

使用 AFNetworking 解析 JSON

使用 AFNetworking 解析 JSON

使用 AFNetworking 解析 JSON 文件

使用 AFNetworking 将 JSON 解析为 NSDictionary