Конвертировать канал JSON в NSDictionary - PullRequest
29 голосов
/ 18 февраля 2011

Где JSON_CATEGORY_DATA_URL_STRING - это URL моего фида, который возвращается в виде:

[
    {
        "group":"For Sale",
        "code":"SSSS"
    },
    {
        "group":"For Sale",
        "category":"Wanted",
        "code":"SWNT"
    }
]

Я не могу получить хороший NSDictionary (или NSArray) из следующего кода:

+ (NSDictionary *)downloadJSON
{

NSDictionary *json_string;
NSString *dataURL = [NSString stringWithFormat:@"%@", JSON_CATEGORY_DATA_URL_STRING];
NSLog(@"%@",dataURL);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]];    
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

json_string = [[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]autorelease];
NSDictionary *json_dict = (NSDictionary *)json_string;
NSLog(@"json_dict\n%@",json_dict);
    NSLog(@"json_string\n%@",json_string);

return json_string;
}

Я прочитал много сообщений на эту тему, но не получаю.

Ответы [ 5 ]

100 голосов
/ 20 марта 2012

В IOS5 вы можете использовать NSJSONSerialization для сериализации JSON.

NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
8 голосов
/ 18 февраля 2011

Вы не можете просто привести строку в качестве словаря и ожидать, что она проанализирует JSON. Вы должны использовать библиотеку анализа JSON, чтобы взять эту строку и преобразовать ее в словарь.

2 голосов
/ 24 января 2013

Я сделал класс, который облегчает эту задачу. Он использует NSJSONSerialization для iOS 5. Клонируйте его из github здесь .

1 голос
/ 18 февраля 2011

Вам необходимо использовать анализатор JSON.Вот отредактированный код

+ (NSDictionary *)downloadJSON
{

NSDictionary *json_string;
NSString *dataURL = [NSString stringWithFormat:@"%@", JSON_CATEGORY_DATA_URL_STRING];
NSLog(@"%@",dataURL);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]];    
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

json_string = [[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]autorelease];
//JSONValue is a function that will return the appropriate object like dictionary or array depending on your json string.
NSDictionary *json_dict = [json_string JSONValue];
NSLog(@"json_dict\n%@",json_dict);
    NSLog(@"json_string\n%@",json_string);

return json_dict;
}

. Это должен быть код для получения NSDictionary.но ваша строка json является массивом, поэтому вместо этого используйте.

+ (NSArray *)downloadJSON
{

NSDictionary *json_string;
NSString *dataURL = [NSString stringWithFormat:@"%@", JSON_CATEGORY_DATA_URL_STRING];
NSLog(@"%@",dataURL);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]];    
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

json_string = [[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]autorelease];
NSArray *json_dict = [json_string JSONValue];
NSLog(@"json_dict\n%@",json_dict);
    NSLog(@"json_string\n%@",json_string);

return json_dict;
}

Редактировать: вам нужно использовать JSON.framework для вызова метода JSONValue.
также вам нужно вернуть json_dict вместо json_stringтак как json_string имеет тип NSString, а не NSDictionary или NSArray.
и не выпускает его автоматически, так как это ваша переменная класса

0 голосов
/ 02 февраля 2016

создать метод для извлечения данных. Передайте ваш URL в строке urlwithstring.

-(void)fetchjsondata
{
     NSString *login= [[NSString stringWithFormat:@"your url string"]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"----%@", login);
    NSURL *url = [NSURL URLWithString:[login stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    //-- Get request and response though URL
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];


    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                               dispatch_async(dispatch_get_main_queue(), ^{
                                   if (data) {
                                       dic_property= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                                       NSLog(@"%@", dic_property);
                                       NSLog(@"counts=%d",[[dic_property objectForKey:@"Data"]count]);



                                   }
                                   else {
                                       NSLog(@"network error, %@", [error localizedFailureReason]);
                                   }
                               });

                           }];

}

вызовите fetchjsonmethod в любом месте.

[NSThread detachNewThreadSelector: @selector (fetchdata) toTarget: self withObject: nil];

...