2013-04-04 1 views
1

Мне нужно преобразовать ответ XML в JSON и песок в код json To javaScript.XML в преобразование JSON в iOS

My XML response: 
<cell> 
     <Result>True</Result> 
     <sguid>02291c402-2220-422b-b199-f92f22e56d2f</sguid> 
</cell> 

Я использую XMLReader поддерживающий файл с этого сайта:

XMLReader

Я использую этот код для преобразования XML в JSON:

+ (NSString*) XMLToJson:(CXMLDocument *)xmlDocument 
{ 
    NSError *error = nil; 

    NSArray *resultNodes = [xmlDocument nodesForXPath:@"//cell" error:&error]; 

    if(error) 
     NSLog(@"%@",error.description); 

    CXMLNode *cellNode = [resultNodes objectAtIndex:0]; 

    NSLog(@"%@",cellNode.XMLString); 

    NSError *parseError = nil; 
    NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:cellNode.XMLString error:&parseError]; 

    NSLog(@"%@", xmlDictionary); 

    //{print this. 
    // cell =  { 
    //  Result =   { 
    //   text = True; 
    //  }; 
    //  sguid =   { 
    //   text = "0391c402-1120-460b-b199-f92fffe56d2f"; 
    //  }; 
    // }; 
    //} 




    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:xmlDictionary 
                 options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string 
                 error:&error]; 
    if(error) 
     NSLog(@"%@",error.description); 

    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@", jsonString); 

    return jsonString; 
} 

Я получил JSON ответ, как это :

{ 
    "cell" : { 
    "Result" : { 
     "text" : "True" 
    }, 
    "sguid" : { 
     "text" : "0391c402-1120-460b-b199-f92fffe56d2f" 
    } 
    } 
} 

мне нужен JSON ответ, как это:

{ 
    "cell": { 
    "Result": "True", 
    "sguid": "02291c402-2220-422b-b199-f92f22e56d2f" 
    } 
} 

Потому что тогда я посылаю этот JSON в яваскрипте кода я получаю это исключение JQuery мобильный не знают парсер это и генерирует исключение ошибок синтаксиса.

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

XML into JSON conversion in iOS

благодаря

+0

все, что вам нужно сделать, чтобы проверить, имеет ли этот узел дочерний узел с именем «текст» и не имеет дочернего узла. Затем вы можете извлечь реальные значения и пропустить «текстовые» узлы в XMLReader :) – Bartu

+0

как это проверить? –

ответ

3

Я просто написал функцию для вашей проблемы, я попробовал его с парой XMLs. Дайте мне знать, если вы обнаружите какие-либо вопросы

- (NSMutableDictionary *)extractXML:(NSMutableDictionary *)XMLDictionary 
{ 
    for (NSString *key in [XMLDictionary allKeys]) { 
     // get the current object for this key 
     id object = [XMLDictionary objectForKey:key]; 

     if ([object isKindOfClass:[NSDictionary class]]) { 
      if ([[object allKeys] count] == 1 && 
       [[[object allKeys] objectAtIndex:0] isEqualToString:@"text"] && 
       ![[object objectForKey:@"text"] isKindOfClass:[NSDictionary class]]) { 
       // this means the object has the key "text" and has no node 
       // or array (for multiple values) attached to it. 
       [XMLDictionary setObject:[object objectForKey:@"text"] forKey:key]; 
      } 
      else { 
       // go deeper 
       [self extractXML:object]; 
      } 
     } 
     else if ([object isKindOfClass:[NSArray class]]) { 
      // this is an array of dictionaries, iterate 
      for (id inArrayObject in (NSArray *)object) { 
       if ([inArrayObject isKindOfClass:[NSDictionary class]]) { 
        // if this is a dictionary, go deeper 
        [self extractXML:inArrayObject]; 
       } 
      } 
     } 
    } 

    return XMLDictionary; 
} 

И использовать его как этот

NSDictionary *clearXML = [[self extractXML:[yourParsedXMLDictionary mutableCopy]] copy]; 
+0

Работает очень хорошо. Спасибо. Теперь у меня есть только проблема, что если есть пустой элемент отправляется как эта «clubId»: {} И я хочу это отправить «clubId»: «» Потому Агинские тогда я посылаю этот JSON в яваскрипте кода Я получаю, что исключение jquery mobile не знает парсер этого и выдает исключение синтаксической ошибки. Спасибо. –

+0

, тогда вы должны добавить проверку функции и проверить, является ли результат nsdictionary и содержит 0 ключей. если это так, замените этот объект пустой nsstring. Я думаю, вы можете добавить эту функциональность, поскольку аналогичная проверка реализована выше. Дайте мне знать, если у вас возникнут проблемы с этим, я постараюсь вам помочь (для ясности вы можете подумать о добавлении этой функции с другой функцией) – Bartu

3

Ваша проблема в использовании XMLReader. Для решения этой проблемы вы можете использовать XMLConverter вместо XMLReader.

+0

Великолепное решение, спасибо. :) –

+0

Это помогло lottt и сэкономить время разбора ... –

Смежные вопросы