2008-11-13 11 views
18

Hice algunas pruebas con TouchJSON anoche y funcionó bastante bien en general para casos simples. Estoy usando el siguiente código para leer algún contenido JSON desde un archivo, y deserializar que:Deserialización de un complejo resultado JSON (matriz de diccionarios) con TouchJSON

NSString *jsonString = [[NSString alloc] initWithContentsOfFile:@"data.json"]; 
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding]; 
NSError *error = nil; 
NSDictionary *items = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error]; 
NSLog(@"total items: %d", [items count]); 
NSLog(@"error: %@", [error localizedDescription]); 

que funciona bien si tengo un objeto JSON muy simple en el archivo (es decir, un diccionario):

{"id": "54354", "name": "boohoo"} 

de esta manera pude conseguir el acceso a la matriz de valores, ya que quería conseguir el artículo basado en su índice dentro de la lista:

NSArray *items_list = [items allValues]; 
NSString *name = [items_list objectAtIndex:1]; 

(entiendo que yo podría tener fet ched el nombre con la API de diccionario)

Ahora me gustaría deserializar una cadena JSON semi-compleja, que representa una matriz de diccionarios. Un ejemplo de tal cadena JSON es a continuación:

[{"id": "123456", "name": "touchjson"}, {"id": "3456", "name": "bleh"}] 

Cuando trato de ejecutar el mismo código de seguridad contra este nuevo contenido en el archivo data.json, no consigo ningún resultado espalda. Mi llamada NSLog() dice "artículos totales: 0", y no vuelve a aparecer ningún error en el objeto NSError.

¿Alguna pista sobre lo que está pasando? Estoy completamente perdido en qué hacer, ya que no hay mucha documentación disponible para TouchJSON, y mucho menos ejemplos de uso.

Respuesta

8

Ésta no es una respuesta, pero un puntero a un marco diferente:

http://code.google.com/p/json-framework/

He estado usando un poco últimamente, la serialización y des-serializar estructuras de datos complejas a partir de tercer servicios de fiestas como Google Local y entre mi propio código Objective-C y Perl sin ningún problema. Sin mencionar que la API es ridículamente fácil de tratar.

¡Buena suerte!

+0

Gracias, pude descubrir cómo deserializar esa compleja cadena JSON con json-framework. – jpm

+0

He estado usando este framework también para estructuras complejas de json y aún no me he encontrado con ningún problema – seanalltogether

+2

¡El enlace está muerto! – Gustav

0

En su corazón ofertas JSON con los objetos, el código de des-serializar debe ser el siguiente

{"objects":[{"id": "123456", "name": "touchjson"}, {"id": "3456", "name": "bleh"}]}

el cual funciona con la última caja.

+2

Un buen marco json debería ser capaz de manejar un objeto o una matriz como el contenedor de alto nivel para la estructura de datos – seanalltogether

+0

@sean - eso no es cierto. Técnicamente JSON con una matriz como contenedor de alto nivel NO es JSON legal. – schwa

+3

schwa, dice quién? http://www.ietf.org/rfc/rfc4627.txt?number=4627 "Un texto JSON es un objeto serializado o array. JSON-text = objeto/array" "5. Generadores Un generador JSON produce texto JSON. El texto resultante DEBE ajustarse estrictamente a la gramática JSON. " Ese documento incluso tiene una matriz de nivel superior ejemplo – seanalltogether

12

Soy el autor de TouchJSON.

Su objeto más externo debería ser un diccionario y NO una matriz. Cualquier cosa que no sea un diccionario no es legal. Si usted tiene que tener una matriz como el objeto más externo a continuación, utilizar el método (que está en desuso técnicamente, pero no va en cualquier lugar pronto)

- (id)deserialize:(NSData *)inData error:(NSError **)outError; 

Ver: http://www.json.com/json-schema-proposal/ para más información abotu lo que es y no es legal JSON.

+0

Agradezco su respuesta a mi pregunta, antes que nada. Me sorprendió escuchar que el objeto más externo no puede ser una matriz, ya que he estado haciendo este tipo de resultados JSON durante mucho tiempo, y la mayoría de las veces las cosas funcionan bien con otras bibliotecas. Continuando en un comentario separado ... – jpm

+4

Según el JSON RFC creado por el mismo Douglas Crockford (http://www.ietf.org/rfc/rfc4627.txt), las matrices como objetos ultraperiféricos son perfectamente válidas. Vea la página 7/8 para un ejemplo real allí. – jpm

+1

Consulte http://robubu.com/?p=24 para obtener más información. Deben evitarse las matrices de nivel superior. Independientemente de que TouchJSON pueda procesarlos, consulte la API i mencionada anteriormente. – schwa

0

@Mathieu - creo que esto es lo que busca (6 meses de retraso, lo sé :), pero sólo se encontró con el mismo problema)

Copiar y pegar desde aquí: http://groups.google.com/group/touchcode-dev/browse_thread/thread/ada885832019f45b

NSArray *tweetsArray = [resultsDictionary objectForKey:@"results"]; 
for (NSDictionary *tweetDictionary in tweetsArray) { 
    NSString *tweetText = [tweetDictionary objectForKey:@"text"]; 
    [tweets addObject:tweetText]; 
} 

para dar más contexto, el JSON que estoy de análisis está en la forma general de
:

{"results": 
    [ 
    {"text":"tweet1"}, 
    {"text":"tweet2"}, 
    {"text":"tweet3"} 
    ] 
} 
Cuestiones relacionadas