tiene support salio que logo cuando ios objective-c json nsmutablearray nsarray

support - JSON analizando en iOS 7



iphone ios 4 (14)

// ----------------- json for localfile ---------------------------

NSString *pathofjson = [[NSBundle mainBundle]pathForResource:@"test1" ofType:@"json"]; NSData *dataforjson = [[NSData alloc]initWithContentsOfFile:pathofjson]; arrayforjson = [NSJSONSerialization JSONObjectWithData:dataforjson options:NSJSONReadingMutableContainers error:nil]; [tableview reloadData];

// ------------- json for urlfile -------------------------------- ---

NSString *urlstrng = @"http://www.json-generator.com/api/json/get/ctILPMfuPS?indent=4"; NSURL *urlname = [NSURL URLWithString:urlstrng]; NSURLRequest *rqsturl = [NSURLRequest requestWithURL:urlname];

// ------------ json for urlfile asynchronous ----------------------

[NSURLConnection sendAsynchronousRequest:rqsturl queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { arrayforjson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; [tableview reloadData]; }];

// ------------- json para urlfile por síncrono ----------------------

NSError *error; NSData *data = [NSURLConnection sendSynchronousRequest:rqsturl returningResponse:nil error:&error]; arrayforjson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; [tableview reloadData]; } ;

Estoy creando una aplicación para el sitio web existente. Actualmente tienen el JSON en el siguiente formato:

[ { "id": "value", "array": "[{/"id/" : /"value/"} , {/"id/" : /"value/"}]" }, { "id": "value", "array": "[{/"id/" : /"value/"},{/"id/" : /"value/"}]" } ]

que analizan después de escapar del carácter / usando Javascript.

Mi problema es cuando lo analizo en iOS usando el siguiente comando:

NSArray *result = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&localError];

y haz esto:

NSArray *Array = [result valueForKey:@"array"];

En lugar de una Array tengo el objeto NSMutableString .

  • El sitio web ya está en producción, así que simplemente no puedo pedirles que cambien su estructura existente para devolver un objeto JSON adecuado. Sería mucho trabajo para ellos.

  • Entonces, hasta que cambien la estructura subyacente, ¿hay alguna forma de que funcione en iOS como lo hacen con javascript en su website ?

Cualquier ayuda / sugerencia sería muy útil para mí.


@property NSMutableURLRequest * urlReq;

sesión de @property NSURLSession *;

@property NSURLSessionDataTask * dataTask;

@property NSURLSessionConfiguration * sessionConfig;

@property NSMutableDictionary * appData;

@property NSMutableArray * valueArray; @property NSMutableArray * keysArray;

  • (void) viewDidLoad {[super viewDidLoad]; self.valueArray = [[NSMutableArray alloc] init]; self.keysArray = [[NSMutableArray alloc] init]; self.linkString = @ " http://country.io/names.json "; [auto getData];

- (void) getData
{self.urlReq = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: self.linkString]];

self.sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; self.session = [NSURLSession sessionWithConfiguration:self.sessionConfig]; self.dataTask = [self.session dataTaskWithRequest:self.urlReq completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { self.appData = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@",self.appData); self.valueArray=[self.appData allValues]; self.keysArray = [self.appData allKeys]; }]; [self.dataTask resume];


Como la gente acaba de decir más arriba, debe usar la NSJSONSerialization para deserializar JSON en estructuras de datos utilizables como NSDictionary o NSArray primero.

Sin embargo, si desea asignar el contenido de su JSON a sus objetos de Objective-C, tendrá que asignar cada atributo del NSDictionary/NSArray a su propiedad de objeto. Esto podría ser un poco doloroso si sus objetos tienen muchos atributos.

Para automatizar el proceso, le recomiendo que utilice la categoría Motis en NSObject (un proyecto personal) para lograrlo, por lo que es muy ligero y flexible. Puedes leer cómo usarlo en esta publicación . Pero solo para mostrarle, solo necesita definir un diccionario con la asignación de sus atributos de objeto JSON a sus nombres de propiedades de objeto de Objective-C en sus subclases de NSObject :

- (NSDictionary*)mjz_motisMapping { return @{@"json_attribute_key_1" : @"class_property_name_1", @"json_attribute_key_2" : @"class_property_name_2", ... @"json_attribute_key_N" : @"class_property_name_N", }; }

y luego realizar el análisis haciendo:

- (void)parseTest { // Some JSON object NSDictionary *jsonObject = [...]; // Creating an instance of your class MyClass instance = [[MyClass alloc] init]; // Parsing and setting the values of the JSON object [instance mjz_setValuesForKeysWithDictionary:jsonObject]; }

La configuración de las propiedades del diccionario se realiza mediante KeyValueCoding (KVC) y puede validar cada atributo antes de establecerlo mediante la validación de KVC .

Espero que te ayude tanto como a mí.


Como otra respuesta ha dicho, ese valor es una cadena.

Puede evitarlo convirtiendo esa cadena en datos, ya que parece ser una cadena json válida y luego analizar ese objeto de datos json nuevamente en una matriz que puede agregar a su diccionario como el valor de la clave.


El JSON correcto probablemente debería verse algo como:

[ { "id": "value", "array": [{"id": "value"},{"id": "value"}] }, { "id": "value", "array": [{"id": "value"},{"id": "value"}] } ]

Pero, si está atascado en el formato provisto en su pregunta, debe hacer que el diccionario sea mutable con NSJSONReadingMutableContainers y luego volver a llamar a NSJSONSerialization para cada una de esas entradas de array :

NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; if (error) NSLog(@"JSONObjectWithData error: %@", error); for (NSMutableDictionary *dictionary in array) { NSString *arrayString = dictionary[@"array"]; if (arrayString) { NSData *data = [arrayString dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; dictionary[@"array"] = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (error) NSLog(@"JSONObjectWithData for array error: %@", error); } }


Método predeterminado de JSON:

+ (NSDictionary *)stringWithUrl:(NSURL *)url postData:(NSData *)postData httpMethod:(NSString *)method { NSDictionary *returnResponse=[[NSDictionary alloc]init]; @try { NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:180]; [urlRequest setHTTPMethod:method]; if(postData != nil) { [urlRequest setHTTPBody:postData]; } [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [urlRequest setValue:@"text/html" forHTTPHeaderField:@"Accept"]; NSData *urlData; NSURLResponse *response; NSError *error; urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error]; returnResponse = [NSJSONSerialization JSONObjectWithData:urlData options:kNilOptions error:&error]; } @catch (NSException *exception) { returnResponse=nil; } @finally { return returnResponse; } }

Método de devolución:

+(NSDictionary *)methodName:(NSString*)string{ NSDictionary *returnResponse; NSData *postData = [NSData dataWithBytes:[string UTF8String] length:[string length]]; NSString *urlString = @"https//:..url...."; returnResponse=[self stringWithUrl:[NSURL URLWithString:urlString] postData:postData httpMethod:@"POST"]; return returnResponse; }


Puede ser que esto te ayude.

- (void)jsonMethod { NSMutableArray *idArray = [[NSMutableArray alloc]init]; NSMutableArray *nameArray = [[NSMutableArray alloc]init]; NSMutableArray* descriptionArray = [[NSMutableArray alloc]init]; NSHTTPURLResponse *response = nil; NSString *jsonUrlString = [NSString stringWithFormat:@"Enter your URL"]; NSURL *url = [NSURL URLWithString:[jsonUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url]; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; NSDictionary *result = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]; NSLog(@"Result = %@",result); for (NSDictionary *dic in [result valueForKey:@"date"]) { [idArray addObject:[dic valueForKey:@"key"]]; [nameArray addObject:[dic valueForKey:@"key"]]; [descriptionArray addObject:[dic valueForKey:@"key"]]; } }


Prueba este método simple ...

- (void)simpleJsonParsing { //-- Make URL request with server NSHTTPURLResponse *response = nil; NSString *jsonUrlString = [NSString stringWithFormat:@"http://domain/url_link"]; NSURL *url = [NSURL URLWithString:[jsonUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; //-- Get request and response though URL NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url]; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; //-- JSON Parsing NSMutableArray *result = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]; NSLog(@"Result = %@",result); for (NSMutableDictionary *dic in result) { NSString *string = dic[@"array"]; if (string) { NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; dic[@"array"] = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; } else { NSLog(@"Error in url response"); } } }


#define FAVORITE_BIKE @"user_id=%@&bike_id=%@" @define FAVORITE_BIKE @"{/"user_id/":/"%@/",/"bike_id/":/"%@/"}" NSString *urlString = [NSString stringWithFormat:@"url here"]; NSString *jsonString = [NSString stringWithFormat:FAVORITE_BIKE,user_id,_idStr]; NSData *myJSONData =[jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSMutableData *body = [NSMutableData data]; [body appendData:[NSData dataWithData:myJSONData]]; [request setHTTPBody:body]; NSError *error; NSURLResponse *response; NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSString *str = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; if(str.length > 0) { NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding]; NSMutableDictionary *resDict =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; }


//-------------- get data url-------- NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://echo.jsontest.com/key/value"]]; NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSLog(@"response==%@",response); NSLog(@"error==%@",Error); NSError *error; id jsonobject=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; if ([jsonobject isKindOfClass:[NSDictionary class]]) { NSDictionary *dict=(NSDictionary *)jsonobject; NSLog(@"dict==%@",dict); } else { NSArray *array=(NSArray *)jsonobject; NSLog(@"array==%@",array); }


NSError *err; NSURL *url=[NSURL URLWithString:@"your url"]; NSURLRequest *req=[NSURLRequest requestWithURL:url]; NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:&err]; NSDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; NSArray * serverData=[[NSArray alloc]init]; serverData=[json valueForKeyPath:@"result"];


-(void)responsedata { NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:replacedstring]]; [request setHTTPMethod:@"GET"]; NSURLSessionConfiguration *config=[NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session=[NSURLSession sessionWithConfiguration:config]; NSURLSessionDataTask *datatask=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"ERROR OCCURE:%@",error.description); } else { NSError *error; NSMutableDictionary *responseDict=[[NSMutableDictionary alloc]init]; responseDict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; if (error==nil) { // use your own array or dict for fetching as per your key.. _responseArray =[[NSMutableArray alloc]init]; _geometryArray=[[NSMutableArray alloc]init]; _responseArray=[responseDict valueForKeyPath:@"result"]; referncestring =[[_photosArray objectAtIndex:0]valueForKey:@"photo_reference"]; _geometryArray=[_responseArray valueForKey:@"geometry"]; // _locationArray=[[_geometryArray objectAtIndex:0]valueForKey:@"location"]; _locationArray=[_geometryArray valueForKey:@"location"]; latstring=[_locationArray valueForKey:@"lat"]; lngstring=[_locationArray valueForKey:@"lng"]; coordinates = [NSMutableString stringWithFormat:@"%@,%@",latstring,lngstring]; } } dispatch_sync(dispatch_get_main_queue(), ^ { // call the required method here.. }); }]; [datatask resume]; //dont forget it }


NSString *post=[[NSString stringWithFormat:@"command=%@&username=%@&password=%@",@"login",@"username",@"password"]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.blablabla.com"]]; [request setHTTPMethod:@"POST"]; [request setValue:@"x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; [request setHTTPBody:[NSData dataWithBytes:[post UTF8String] length:strlen([post UTF8String])]]; NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; id jsonobject=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; if ([jsonobject isKindOfClass:[NSDictionary class]]) { NSDictionary *dict=(NSDictionary *)jsonobject; NSLog(@"dict==%@",dict); } else { NSArray *array=(NSArray *)jsonobject; NSLog(@"array==%@",array); }


  • Siempre puede jsonData el jsonData antes de entregarlo a NSJSONSerialization . O puede usar la cadena para construir otro json object para obtener la array .

  • NSJSONSerialization está haciendo lo correcto, el valor en su ejemplo debería ser una cadena.