2013-11-21 5 views
1

У меня есть файл JSON в ответе.разбор JSON файл

(
    { 
    location =   { 
     lat = "23.0429226"; 
     lng = "72.51406419999999"; 
    }; 
    "location_type" = APPROXIMATE; 
    viewport =   { 
     northeast =    { 
      lat = "23.0531899"; 
      lng = "72.5300716"; 
     }; 
     southwest =    { 
      lat = "23.0326545"; 
      lng = "72.4980568"; 
     }; 
    }; 
} 
) 

Чтобы разобрать лат и долгое местоположение, я написал этот код. но когда я конвертирую это значение в значение float, он дает мне такую ​​ошибку.

Blockquote

-[__NSArrayI floatValue]: unrecognized selector sent to instance 0xdd2d080 
2013-11-21 19:31:15.602 App[3515:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI floatValue]: unrecognized selector sent to instance 0xdd2d080' 
*** First throw call stack: 
(
0 CoreFoundation      0x0328c5e4 __exceptionPreprocess + 180 
1 libobjc.A.dylib      0x0300f8b6 objc_exception_throw + 44 
2 CoreFoundation      0x03329903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275 
3 CoreFoundation      0x0327c90b ___forwarding___ + 1019 
4 CoreFoundation      0x0327c4ee _CF_forwarding_prep_0 + 14 
5 App       0x000885d8 __55-[WorkLocationViewController sendLatLongRequestAction:]_block_invoke + 744 
6 App       0x0002901e -[ASIHTTPRequest reportFinished] + 222 
7 libobjc.A.dylib      0x0302181f -[NSObject performSelector:withObject:] + 70 
8 Foundation       0x02c64c18 __NSThreadPerformPerform + 285 
9 CoreFoundation      0x032158af __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
10 CoreFoundation      0x0321523b __CFRunLoopDoSources0 + 235 
11 CoreFoundation      0x0323230e __CFRunLoopRun + 910 
12 CoreFoundation      0x03231b33 CFRunLoopRunSpecific + 467 
13 CoreFoundation      0x0323194b CFRunLoopRunInMode + 123 
14 GraphicsServices     0x0462b9d7 GSEventRunModal + 192 
15 GraphicsServices     0x0462b7fe GSEventRun + 104 
16 UIKit        0x01d8294b UIApplicationMain + 1225 
17 App       0x000040fd main + 141 
18 libdyld.dylib      0x037fb725 start + 0 
19 ???         0x00000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Мой код:

NSDictionary *geo=[res valueForKey:@"geometry"]; 
    NSDictionary *loc=[geo valueForKey:@"location"]; 
    NSLog(@"latitiude is%@",[loc valueForKey:@"lat"]); 
    NSLog(@"lon is %@",[loc valueForKey:@"lng"]); 
    //NSLog(@"float value is%f",[[loc valueForKey:@"lat"] floatValue]); 
    NSString *str=[loc valueForKey:@"lat"]; 
    NSLog(@"string is %@",str); 
    NSString *str1=[loc valueForKey:@"lng"]; 
    workCoordinate.latitude=[str floatValue]; 

    workCoordinate.longitude=[str1 floatValue]; 

и в журнале строка печати, как это:

2013-11-21 19:31:15.599 App[3515:a0b] latitiude is(
"23.0429226" 
) 
2013-11-21 19:31:15.599 App[3515:a0b] lon is (
"72.51406419999999" 
) 
2013-11-21 19:31:15.600 App[3515:a0b] string is (
"23.0429226" 

Вот JSON, который я получаю в ответ.

{ 
results =  (
      { 
     "address_components" =    (
          { 
       "long_name" = "Judges Bunglow Police Chawky"; 
       "short_name" = "Judges Bunglow Police Chawky"; 
       types =      (
        establishment 
       ); 
      }, 
          { 
       "long_name" = "Satya Marg"; 
       "short_name" = "Satya Marg"; 
       types =      (
        route 
       ); 
      }, 
          { 
       "long_name" = Bodakdev; 
       "short_name" = Bodakdev; 
       types =      (
        sublocality, 
        political 
       ); 
      }, 
          { 
       "long_name" = Ahmedabad; 
       "short_name" = Ahmedabad; 
       types =      (
        locality, 
        political 
       ); 
      }, 
          { 
       "long_name" = Ahmedabad; 
       "short_name" = Ahmedabad; 
       types =      (
        "administrative_area_level_2", 
        political 
       ); 
      }, 
          { 
       "long_name" = GJ; 
       "short_name" = GJ; 
       types =      (
        "administrative_area_level_1", 
        political 
       ); 
      }, 
          { 
       "long_name" = India; 
       "short_name" = IN; 
       types =      (
        country, 
        political 
       ); 
      }, 
          { 
       "long_name" = 380015; 
       "short_name" = 380015; 
       types =      (
        "postal_code" 
       ); 
      } 
     ); 
     "formatted_address" = "Judges Bunglow Police Chawky, Satya Marg, Bodakdev, Ahmedabad, GJ 380015, India"; 
     geometry =    { 
      bounds =     { 
       northeast =      { 
        lat = "23.0369726"; 
        lng = "72.51639879999999"; 
       }; 
       southwest =      { 
        lat = "23.03688"; 
        lng = "72.5162807"; 
       }; 
      }; 
      location =     { 
       lat = "23.0368868"; 
       lng = "72.5163184"; 
      }; 
      "location_type" = APPROXIMATE; 
      viewport =     { 
       northeast =      { 
        lat = "23.0382752802915"; 
        lng = "72.51768873029151"; 
       }; 
       southwest =      { 
        lat = "23.0355773197085"; 
        lng = "72.5149907697085"; 
       }; 
      }; 
     }; 
     "partial_match" = 1; 
     types =    (
      police, 
      establishment 
     ); 
    } 
); 
status = OK; 
    } 

ответ

2

Если вы внимательно посмотрите на ваши NSLog результаты, вы увидите, что ваши строки:

NSString *str=[loc valueForKey:@"lat"]; 
NSLog(@"string is %@",str); 

возвращается

 
2013-11-21 19:31:15.600 appname[3515:a0b] string is (
"23.0429226" 
) 

Вместо того, что вы хотели

 
2013-11-21 19:31:15.600 appnane[3515:a0b] string is "23.0429226" 

Те pa Вниматели говорят вам, что valueForKey возвращает NSArray, а не NSString. Два решения, во-первых, вы могли бы просто захватить первый объект из этого массива:

NSArray *latArray=[loc valueForKey:@"lat"]; 
NSString *str=latArray[0] 
NSLog(@"string is %@",str); 

В качестве альтернативы, вы можете использовать objectForKey, а не valueForKey. К сожалению, ваш фрагмент кода не дает понять, какой вложенный массив объектов словаря вы зарегистрировали в верхней части вашего вопроса (например, я не вижу ссылки на @"geometry"). Но, допустим, это было results. Если это так, то вы могли бы сделать что-то вроде:

for (NSDictionary *dictionary in results) { 
    NSDictionary *location = dictionary[@"location"]; // or [dictionary objectForKey:@"location"]; 
    NSString *latString = location[@"lat"]; // or [location objectForKey:@"lat"]; 
    NSString *lngString = location[@"lng"]; // or [location objectForKey:@"lng"]; 

    CGFloat lat = [latString floatValue]; 
    CGFloat lng = [lngString floatValue]; 
} 

В обновленной вопрос, вы предоставляете более полное NSLog полученного объекта, который вы получили от вашего JSON парсер. Например, предположим, что зарегистрированный вами NSDictionary был вызван jsonObject. Затем можно извлечь, что широта и долгота через:

NSString *status   = jsonObject[@"status"]; 
NSArray *results   = jsonObject[@"results"]; 

NSDictionary *result  = results[0]; // let's grab the first result 

NSArray *addressComponents = result[@"address_components"]; 
NSString *formattedAddress = result[@"formatted_address"]; 
NSDictionary *geometry  = result[@"geometry"]; 
NSNumber *partialMatch  = result[@"partial_match"]; 
NSArray *types    = result[@"types"]; 

NSDictionary *location  = geometry[@"location"]; 
NSString *latitudeString = location[@"lat"]; 
NSString *longitudeString = location[@"lng"]; 
CGFloat latitude   = [latitudeString floatValue]; 
CGFloat longitude   = [longitudeString floatValue]; 
+0

я попытался первый метод, но он не работает, я получаю нулевое значение ... У меня есть пост весь файл JSON может у взять пожалуйста посмотрите ... – vivek

+0

я попробовали ваш код, но я получаю сообщение об ошибке использования незаявленного идентификатора. jsonObject – vivek

+0

ok получил вашу оценку ' – vivek