Generar cadena JSON desde NSDictionary en iOS

Tengo un dictionary que necesito para generar una JSON string usando el dictionary . ¿Es posible convertirlo? ¿Pueden ayudarme por favor?

Aquí hay categorías para NSArray y NSDictionary para hacer esto súper fácil. Agregué una opción para impresión bonita (nuevas líneas y tabs para facilitar la lectura).

 @interface NSDictionary (BVJSONString) -(NSString*) bv_jsonStringWithPrettyPrint:(BOOL) prettyPrint; @end 

.

 @implementation NSDictionary (BVJSONString) -(NSString*) bv_jsonStringWithPrettyPrint:(BOOL) prettyPrint { NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:(NSJSONWritingOptions) (prettyPrint ? NSJSONWritingPrettyPrinted : 0) error:&error]; if (! jsonData) { NSLog(@"%s: error: %@", __func__, error.localizedDescription); return @"{}"; } else { return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; } } @end 

.

 @interface NSArray (BVJSONString) - (NSString *)bv_jsonStringWithPrettyPrint:(BOOL)prettyPrint; @end 

.

 @implementation NSArray (BVJSONString) -(NSString*) bv_jsonStringWithPrettyPrint:(BOOL) prettyPrint { NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:(NSJSONWritingOptions) (prettyPrint ? NSJSONWritingPrettyPrinted : 0) error:&error]; if (! jsonData) { NSLog(@"%s: error: %@", __func__, error.localizedDescription); return @"[]"; } else { return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; } } @end 

Apple agregó un analizador y serializador JSON en iOS 5.0 y Mac OS X 10.7. Consulte NSJSONSerialization .

Para generar una cadena JSON desde un NSDictionary o NSArray, ya no necesita importar ningún marco de terceros.

Aquí está cómo hacerlo:

 NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionaryOrArrayToOutput options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string error:&error]; if (! jsonData) { NSLog(@"Got an error: %@", error); } else { NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; } 

Para convertir un NSDictionary en un NSString:

 NSError * err; NSData * jsonData = [NSJSONSerialization dataWithJSONObject:myDictionary options:0 error:&err]; NSString * myString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

NOTA: Esta respuesta se dio antes de que se lanzara iOS 5.

Obtenga el json-framework y haga esto:

 #import "SBJsonWriter.h" ... SBJsonWriter *jsonWriter = [[SBJsonWriter alloc] init]; NSString *jsonString = [jsonWriter stringWithObject:myDictionary]; [jsonWriter release]; 

myDictionary será tu diccionario.

También puede hacerlo sobre la marcha ingresando lo siguiente en el depurador

 po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:yourDictionary options:1 error:nil] encoding:4]; 

Puede pasar array o diccionario. Aquí, estoy tomando NSMutableDictionary.

 NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc]init]; [contentDictionary setValue:@"a" forKey:@"b"]; [contentDictionary setValue:@"c" forKey:@"d"]; 

Para generar una cadena JSON desde un NSDictionary o NSArray, no necesita importar ningún marco de terceros. Solo usa el siguiente código:

 NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:contentDictionary // Here you can pass array or dictionary options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string error:&error]; NSString *jsonString; if (jsonData) { jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; //This is your JSON String //NSUTF8StringEncoding encodes special characters using an escaping scheme } else { NSLog(@"Got an error: %@", error); jsonString = @""; } NSLog(@"Your JSON String is %@", jsonString); 
 NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc]init]; [contentDictionary setValue:@"a" forKey:@"b"]; [contentDictionary setValue:@"c" forKey:@"d"]; NSData *data = [NSJSONSerialization dataWithJSONObject:contentDictionary options:NSJSONWritingPrettyPrinted error:nil]; NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

En Swift (versión 2.0) :

 class func jsonStringWithJSONObject(jsonObject: AnyObject) throws -> String? { let data: NSData? = try? NSJSONSerialization.dataWithJSONObject(jsonObject, options: NSJSONWritingOptions.PrettyPrinted) var jsonStr: String? if data != nil { jsonStr = String(data: data!, encoding: NSUTF8StringEncoding) } return jsonStr } 

Ahora no es necesario que las clases de terceros ios 5 hayan introducido Nsjsonserialization

 NSString *urlString=@"Your url"; NSString *urlUTF8 = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url=[[NSURL alloc]initWithString:urlUTF8]; NSURLRequest *request=[NSURLRequest requestWithURL:url]; NSURLResponse *response; NSData *GETReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; NSError *myError = nil; NSDictionary *res = [NSJSONSerialization JSONObjectWithData:GETReply options:NSJSONReadingMutableLeaves|| NSJSONReadingMutableContainers error:&myError]; Nslog(@"%@",res); 

este código puede ser útil para obtener jsondata.

En Swift, he creado la siguiente función auxiliar:

 class func nsobjectToJSON(swiftObject: NSObject) { var jsonCreationError: NSError? let jsonData: NSData = NSJSONSerialization.dataWithJSONObject(swiftObject, options: NSJSONWritingOptions.PrettyPrinted, error: &jsonCreationError)! if jsonCreationError != nil { println("Errors: \(jsonCreationError)") } else { // everything is fine and we have our json stored as an NSData object. We can convert into NSString let strJSON : NSString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)! println("\(strJSON)") } } 

A partir de ISO7, al menos, puede hacer esto fácilmente con NSJSONSerialization .

 public func jsonPrint(_ o: NSObject, spacing: String = "", after: String = "", before: String = "") { let newSpacing = spacing + " " if o.isArray() { print(before + "[") if let a = o as? Array { for object in a { jsonPrint(object, spacing: newSpacing, after: object == a.last! ? "" : ",", before: newSpacing) } } print(spacing + "]" + after) } else { if o.isDictionary() { print(before + "{") if let a = o as? Dictionary { for (key, val) in a { jsonPrint(val, spacing: newSpacing, after: ",", before: newSpacing + key.description + " = ") } } print(spacing + "}" + after) } else { print(before + o.description + after) } } } 

Este es muy similar al estilo original de impresión Objective-C

Aquí está la versión de Swift 4

 extension NSDictionary{ func toString() throws -> String? { do { let data = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) return String(data: data, encoding: .utf8) } catch (let error){ throw error } } 

}

Ejemplo de uso

 do{ let jsonString = try dic.toString() } catch( let error){ print(error.localizedDescription) } 

O si está seguro de que es un diccionario válido, puede usar

 let jsonString = try? dic.toString()