Я пытаюсь разобрать страницу JSON в Objective-C, создав подкласс NSDictionary и добавив методы getSomeProperty. Мне удалось сделать это с помощью страниц 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".

Как я могу использовать аналогичный метод для получения @ "name1" или id @ "12345" из моего первого примера кода JSON?

0
Lateralus 28 Фев 2016 в 22:14

2 ответа

Лучший ответ

У вас есть множество словарей. Чтобы получить массив выходных данных, вы можете использовать следующий метод:

- (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];

И получить идентификатор с помощью:

NSArray *resultArray = [self getValueString: @"id" fromArray: inputArray];
NSString *firstId = resultArray[0];
1
Rodrigo Pinto 28 Фев 2016 в 20:17

[ ] в начале и конце вашей строки JSON указывает, что это массив, поэтому при синтаксическом анализе JSON вы получите NSArray*, а не {{X3} }. Первым элементом массива является объект, поэтому он будет NSDictionary*. Получите доступ к id следующим образом:

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

Похоже, ваш currentCondition относится к категории на NSDictionary. Если это правда, и вы хотите, чтобы приведенный выше код работал, вам нужно сделать его в категории NSArray. Если это неправда, я не понимаю, что такое self, без дополнительной информации.

0
Lou Franco 28 Фев 2016 в 19:37