Неверная строка touchJSON - PullRequest
       14

Неверная строка touchJSON

2 голосов
/ 14 ноября 2010

Я получаю недопустимую строку JSON, которая содержит; (персонажи. Есть догадки, что происходит?

Мой код:

-(void)getJSONFeed {  
    // Create the URL & Request      
 NSURL *feedURL = [NSURL URLWithString:      
   @"http://maps.googleapis.com/maps/api/geocode/json?      address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true"];    
 NSURLRequest *request = [NSURLRequest requestWithURL:feedURL];  
 // Example connection only. Add Timeouts, cachingPolicy in production  
 [NSURLConnection connectionWithRequest:request delegate:self ];  
 // init the jsonData Property  
 jsonData = [[NSMutableData data] retain];  
}  

// NSURLConnection Delegate Methods. You would want to include more for error handling //  
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSMutableData *)data {  
 NSLog(@"Recieving Data...");  
 // Append the incomming data as it is received  
 [jsonData appendData:data];  
 NSLog(@"%@",jsonData);  
}  

-(NSDictionary *)parseJSON:(NSMutableData *)data {  
 NSLog(@"Parsing JSON");       
 NSError *error = nil;  
 NSDictionary *dictionary = [[CJSONDeserializer deserializer]   deserializeAsDictionary:data error:&error];  
 return dictionary;  
}  

// Parse JSON results with TouchJSON. It converts it into a dictionary.  


-(void)connectionDidFinishLoading:(NSURLConnection *)connection {  
 NSLog(@"Fininshed Loading...");  
 NSDictionary * feedDictionary = [self parseJSON:jsonData];  
 NSLog(@"JSON as NSDictionary: %@", feedDictionary);  
}  

{  
    results =     (
                {
            "address_components" =             (
                                {
                    "long_name" = 1600;
                    "short_name" = 1600;
                    types =                     (
                        "street_number"
                    );
                },
                                {
                    "long_name" = "Amphitheatre Pkwy";
                    "short_name" = "Amphitheatre Pkwy";
                    types =                     (
                        route
                    );
                },
                                {
                    "long_name" = "Mountain View";
                    "short_name" = "Mountain View";
                    types =                     (
                        locality,
                        political
                    );
                },
                                {
                    "long_name" = "San Jose";
                    "short_name" = "San Jose";
                    types =                     (
                        "administrative_area_level_3",
                        political
                    );
                },
                                {
                    "long_name" = "Santa Clara";
                    "short_name" = "Santa Clara";
                    types =                     (
                        "administrative_area_level_2",
                        political
                    );
                },
                                {
                    "long_name" = California;
                    "short_name" = CA;
                    types =                     (
                        "administrative_area_level_1",
                        political
                    );
                },
                                {
                    "long_name" = "United States";
                    "short_name" = US;
                    types =                     (
                        country,
                        political
                    );
                },
                                {
                    "long_name" = 94043;
                    "short_name" = 94043;
                    types =                     (
                        "postal_code"
                    );
                }
            );
            "formatted_address" = "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA";
            geometry =             {
                location =                 {
                    lat = "37.422782";
                    lng = "-122.085099";
                };
                "location_type" = ROOFTOP;
                viewport =                 {
                    northeast =                     {
                        lat = "37.4259296";
                        lng = "-122.0819514";
                    };
                    southwest =                     {
                        lat = "37.4196344";
                        lng = "-122.0882466";
                    };
                };
            };
            types =             (
                "street_address"
            );
        }
    );
    status = OK;
}

UPDATE:

Каким-то образом это интерпретирует его как список свойств. Формат кажется похожим на оригинальный формат NeXTSTEP с =;

1 Ответ

0 голосов
/ 15 ноября 2010

Я не уверен на 100%, в чем вопрос.Вы делаете правильное HTTP-соединение, которое делает значимый запрос от Google (если вы удалите шесть пробелов в середине, которые почти наверняка являются результатом копирования кода и вставьте сюда).Вы накапливаете результат.В данном коде вы, кажется, пропускаете объект jsonData, но я предполагаю, что это не имеет отношения к вопросу.

Вы используете объект CJSONDeserializer, о котором я не слышал, но, кажется, обычно упоминается в Google, так что, вероятно,заслуживающее доверие.Возвращает действительный NSDictionary.Вы печатаете словарь, и он дает правильные результаты.

Неужели путаница состоит в том, что когда вы печатаете словарь на консоль, он не выглядит идентично JSON, который вы получили?Если это так, то это потому, что у него больше нет концепции, что он исходит из JSON, а Cocoa предшествует стандарту JSON и, следовательно, не использует его для ведения журнала.

В любом случае feedDictionary является допустимым словарем.Следующее:

NSLog(@"%@", [feedDictionary objectForKey:@"status"]);

Выведет строку «ОК».Это:

NSArray *addressComponents = [feedDictionary objectForKey:@"address_components"];
for(NSDictionary *component in addressComponents)
{
    NSLog(@"%@", [component objectForKey:@"long_name"]);
}

Будет печатать строки «1600», «Амфитеатр Pkwy», «Маунтин-Вью», «Сан-Хосе», «Санта-Клара», «Калифорния», «США», «94043».'в таком порядке.

Если вы хотите распечатать необработанный JSON на консоль, вы, вероятно, захотите что-то вроде этого (при условии, что результат возвращается как UTF8):

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {  
 NSLog(@"Fininshed Loading...");  

 NSString *feedString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
 NSLog(@"JSON was: %@", feedString);
 [feedString release];

 /*NSDictionary * feedDictionary = [self parseJSON:jsonData];  
 NSLog(@"JSON as NSDictionary: %@", feedDictionary);  */
}

Хотя тогдавам все равно придется проанализировать его в словаре, чтобы получить из него значимые результаты.

...