Как извлечь фактическую NSString из объекта json как NSArray - PullRequest
2 голосов
/ 31 декабря 2010

Я работаю с большим набором json и мне действительно нужно представление NSString того, что находится внутри NSArray, включая все {}

Мой вопрос заключается в следующем - это лучший способ, чем просто зацикливаниечерез каждый NSArray внутри основного NSArray и выводя описание по одному?

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

Рабочий код ниже (спасибо заранее!)

NSString* responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    [responseData release];
  NSArray* json = [responseString JSONValue];
  NSArray* item = [json valueForKeyPath:@"d.data"];
  NSArray* hatjson = [item objectForKey:@"hat"];

  NSMutableString * result = [[NSMutableString alloc] init];
  for (NSObject * obj in hatjson)
  {
    [result appendString:[obj description]];
  }
  NSLog(@"the hat json is .. %@", result);

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

Я предполагаю, что вы используете библиотеку JSON отсюда: https://github.com/stig/json-framework

Вы жалуетесь на то, что предоставленный вами код хрупок, но, как вам кажется, ситуация выглядит так, как вы хотитеявляется хрупким, так что я думаю, что код, который обращается к нему, может быть хрупким, если вы помещаете туда NSAsserts, чтобы вы знали как можно скорее, когда ваши предположения были нарушены.код, который вы показали, заключается в том, что он предполагает, что вы возвращаете NSArrays, когда из того, как вы к нему обращаетесь, видно, что он фактически дает вам NSDictionaries.

Например, читая ваш код, я заключаю, что responseString представляет собой вложенную карту JSON, выглядящую примерно так:

{ "d": { "data": { "hat": "baseball cap" } } }

Тогда возникает вопрос: «Ожидаете ли вы когда-нибудь значение, соответствующееключ "шляпа", чтобы когда-либо иметь более одного значения? "Я бы обобщил этот код так:

NSString* responseString = [[[NSString alloc] initWithData: responseData encoding: NSUTF8StringEncoding] autorelease];
[responseData release];

id json = [responseString JSONValue];
id hatJSONValue = [json valueForKeyPath:@"d.data.hat"];

NSString* result = nil;

if ([hatJSONValue isKindOfClass: [NSArray class]] && [hatJSONValue count] == 1)
{
    result = [[hatJSONValue lastObject] description];
}
else
{
    NSAssert(NO, @"Assumptions about returned JSON were wrong.");
}

NSLog(@"the hat json is .. %@", result);

Вообще говоря, вам всегда приходится искать компромисс между написанием нехрупкого кода и выполнением задач.Ключ должен заключаться в том, что если ваш код будет делать предположения, вы должны утверждать, что они верны, поэтому, если ситуация когда-либо изменится, вы будете знать!

1 голос
/ 31 декабря 2010
// …
NSArray* hatjson = [item objectForKey:@"hat"];
NSString *result = [hatjson JSONRepresentation];
NSLog(@"the hat json is .. %@", result);

Я предполагаю, что вы используете SBJSON для анализа JSON. SBJSON определяет категорию на NSObject, которая включает метод

- (NSString *)JSONRepresentation;

Этот метод возвращает строку с представлением JSON данного объекта, если этот объект является экземпляром класса, который SBJSON может преобразовать в JSON (например, строки, числа, массивы, словари).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...