Tengo una cadena JSON (de PHP json_encode()
que se ve así:
[{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
Quiero analizar esto en algún tipo de estructura de datos para mi aplicación de iPhone. Supongo que lo mejor para mí sería tener una matriz de diccionarios, por lo que el elemento 0 en la matriz es un diccionario con teclas "id" => "1"
y "name" => "Aaa"
.
Sin NSJSONSerialization
embargo , no entiendo cómo almacena los datos. Aquí está mi código hasta ahora:
NSError *e = nil;
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData: data
options: NSJSONReadingMutableContainers
error: &e];
Esto es algo que vi como ejemplo en otro sitio web. He estado intentando obtener una lectura del JSON
objeto imprimiendo la cantidad de elementos y cosas así, pero siempre estoy obteniendo EXC_BAD_ACCESS
.
¿Cómo uso NSJSONSerialization
para analizar el JSON anterior y convertirlo en la estructura de datos que mencioné?
ios
objective-c
json
nsdictionary
Logan Serman
fuente
fuente
Respuestas:
Su objeto raíz json no es un diccionario sino una matriz:
Esto podría darle una idea clara de cómo manejarlo:
fuente
[JSON count]
devolver algo en lugar de simplemente darme EXC_BAD_ACCESS?!jsonArray
e imprimí el error. Esto debería mostrar cualquier error que ocurriera durante el análisis.jsonArray
lo creaste, debería ser de liberación automática.Este es mi código para verificar si el json recibido es una matriz o diccionario:
He intentado esto para las opciones: kNilOptions y NSJSONReadingMutableContainers y funciona correctamente para ambos.
Obviamente, el código real no puede ser de esta manera donde creo el puntero NSArray o NSDictionary dentro del bloque if-else.
fuente
Esto funciona para mi. Su
data
objeto es probablementenil
y, como señaló rckoenes, el objeto raíz debería ser una matriz (mutable). Ver este código:(Tuve que escapar de las comillas en la cadena JSON con barras invertidas).
fuente
Su código parece estar bien, excepto que el resultado es un
NSArray
, no unNSDictionary
, aquí hay un ejemplo:Las dos primeras líneas solo crean un objeto de datos con el JSON, lo mismo que obtendría al leerlo desde la red.
Contenido NSLog (una lista de diccionarios):
fuente
NSJSONReadingMutableLeaves
"Especifica que las cadenas de hojas en el gráfico de objetos JSON se crean como instancias de NSMutableString".NSJSONReadingMutableContainers
:: "Especifica que las matrices y los diccionarios se crean como objetos mutables".En los datos JSON anteriores, está mostrando que tenemos una matriz que contiene el número de diccionarios.
Debe usar este código para analizarlo:
Para rápido 3/3 +
fuente
El siguiente código obtiene un objeto JSON de un servidor web y lo analiza en un NSDictionary. He usado la API openweathermap que devuelve una respuesta JSON simple para este ejemplo. Para mantenerlo simple, este código usa solicitudes sincrónicas.
fuente
@rckoenes ya le mostró cómo obtener correctamente sus datos de la cadena JSON.
A la pregunta que hizo:
EXC_BAD_ACCESS
casi siempre aparece cuando intenta acceder a un objeto después de que se ha lanzado [auto-]. Esto no es específico de la [des] serialización JSON, sino que solo tiene que ver con que usted obtenga un objeto y luego acceda a él después de que se haya lanzado. El hecho de que vino a través de JSON no importa.Hay muchísimas páginas que describen cómo depurar esto: desea Google (o SO)
obj-c zombie objects
y, en particularNSZombieEnabled
, lo que le resultará invaluable para ayudarlo a determinar la fuente de sus objetos zombie. ("Zombi" es como se llama cuando sueltas un objeto pero mantienes un puntero sobre él e intentas hacer referencia a él más adelante)fuente
Swift 2.0 en Xcode 7 (Beta) con bloque do / try / catch:
fuente
NOTA: Para Swift 3 . Su cadena JSON está devolviendo Array en lugar de Dictionary. Por favor pruebe lo siguiente:
fuente
fuente
El problema parece ser con la liberación automática de objetos. NSJSONSerialization JSONObjectWithData obviamente está creando algunos objetos lanzados automáticamente y se los está devolviendo. Si intenta llevar eso a un hilo diferente, no funcionará ya que no se puede desasignar en un hilo diferente.
El truco podría ser intentar hacer una copia mutable de ese diccionario o matriz y usarlo.
Tratar un NSDictionary como NSArray no dará como resultado una excepción de acceso incorrecto, sino que probablemente se bloqueará cuando se realice una llamada al método.
Además, puede ser que las opciones realmente no importen aquí, pero es mejor dar NSJSONReadingMutableContainers | NSJSONReadingMutableContainers | NSJSONReadingAllowFragments, pero incluso si son objetos de autorremisión, puede que no resuelva este problema.
fuente
mal ejemplo, debería ser algo como esto {"id": 1, "name": "algo como nombre"}
número y cadena se mezclan.
fuente