Нужна помощь для разбора json для iPhone - PullRequest
1 голос
/ 18 мая 2011

Я хочу проанализировать файл JSON в своем приложении для iphone.Проблема в том, что я могу анализировать простые файлы json, но я не совсем понимаю, как выполнить синтаксический анализ json следующего типа:

[{"123":  
  [{ "item_id":"222",  
     "image_count":"2",  
     "image_filetype":".jpg",  
     "image_url":"http:\/\/someurl.jpg",  
  },  
  {"item_id":"333",  
     "image_count":"2",  
     "image_filetype":".jpg",  
     "image_url":"http:\/\/someurl.jpg",  
  }]  
}]  

Может ли кто-нибудь мне помочь, как извлечь все img_urls для "123".

Спасибо.

Ответы [ 5 ]

3 голосов
/ 18 мая 2011
NSString *jsonString = …;

// The top-level object is an array
NSArray *array = [jsonString JSONValue];

// The first element in the array is an object containing a name-value
// pair for the key/name "123". The value is itself an array
NSArray *itemsIn123 = [[array objectAtIndex:0] objectForKey:@"123"];

// Use Key-Value Coding to get an array of all values for the key
// image_url
NSArray *imgurls = [itemsIn123 valueForKey:@"image_url"];

<ч /> Редактировать на основе комментариев:

Поскольку массив верхнего уровня может состоять из нескольких объектов, каждый из которых имеет одну пару имя-значение с неизвестным именем, необходимо вручную выполнить итерацию по массиву верхнего уровня:

NSString *jsonString = …;

NSMutableArray *imgurls = [NSMutableArray array];

// The top-level object is an array
NSArray *array = [jsonString JSONValue];

// Each element in the top-level array is an object
for (NSDictionary *outerObject in array) {
    // Iterate over all values in the object. Each (single) value is an array
    for (NSArray *innerArray in [outerObject allValues]) {
        [imgurls addObjectsFromArray:[innerArray valueForKey:@"image_url"]];
    }
}
2 голосов
/ 18 мая 2011

Сначала вы хотите взять значения ключей, например 123,112,189, поэтому мы возьмем ключи в массив

говорят, что структура похожа на [Web {123 {URL-адрес изображения} 112 {URL-адрес изображения} 189 {URL-адрес изображения}]

так

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

 SBJSON *jsonParser = [SBJSON alloc]init];

 NSMutableArray *yourArray1 = [jsonParser objectWithString:responseString]copy]]autorelease;

    ufArray = [[yourArray1 valueForKey:@"web"] copy];

   for (NSString *s in ufArray) {

    [keys addObject:[NSDictionary dictionaryWithObjectsAndKeys:s,@"keys",nil]];
}

 NSLOG(@"keys :%@",keys);

 // this will contain 112,123,114 etc values
      initialize a NSMutableArray

      finalArray = [NSMutableArray alloc]init];

    for (int i = 0; i < [ufArray count]; i ++) {

    yourArray1 = [ufArray valueForKey:[[keys objectAtIndex:i]valueForKey:@"keys"]];

    // [keys object at indes:i] - > 123 val / next loop 112 array like that

    [finalArray addObject:yourArray1];
}


   [jsonParser release];

    jsonParser = nil;   

Надеюсь, это поможет!

2 голосов
/ 18 мая 2011

Значением для объекта "123" будет NSArray из NSDictionaries. В каждом из этих словарей есть ключ image_url для URL изображения.

Код будет зависеть от того, какую библиотеку синтаксического анализа JSON вы используете, но основы должны быть одинаковыми.

0 голосов
/ 18 мая 2011

Я никогда раньше не использовал JSON, никогда раньше не пользовался iPhone, никогда раньше не использовал Xcode ... но я бы подумал, что это что-то вроде ...

//object and image for item ID 222
123: item_id(222).image_url("some_url")

или второго иследующие элементы

//hi
123: item_id(333).image_url("some_url")

Однако что-то лучше было бы, когда вы можете извлечь изображение без URL-адреса, используя идентификатор элемента и идентификатор изображения, поэтому при вызове объекта 123 вы можете указать идентификатор элемента иидентификатор изображения, который будет выводить всю необходимую вам информацию.Например, может отображаться количество, тип файла и изображение.

123: item_id(222).image_id(222)

Является ли файл данных SQL или XML?XML обычно быстрее!Так что читайте об узлах.

Надеюсь, это поможет.

DL.

0 голосов
/ 18 мая 2011

Хорошо, если этот массив был назван jArray

var img_urls = [];
var jL = jArray[0][123].length;
var img_urls = [];
for(var i = 0; i < jL; i++){
    img_urls[i] = jArray[0][123][i].image_url;
}

//display in console: 
console.log(img_urls);

demo: http://jsfiddle.net/maniator/Vx3hu/4/

...