ios objective-c json string

Generar cadena JSON desde NSDictionary en iOS



objective-c string (13)

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

Tengo un dictionary que necesito para generar una JSON string usando dictionary . ¿Es posible convertirlo? ¿Pueden ustedes ayudar en esto?


Ahora no es necesario que las clases de terceros ios 5 introduzcan 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.


Apple agregó un analizador y serializador JSON en iOS 5.0 y Mac OS X 10.7. Ver 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]; }


Aquí está la versión 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, entonces puede usar

let jsonString = try? dic.toString()


Aquí hay categorías para NSArray y NSDictionary para hacer esto súper fácil. He añadido una opción para impresión bonita (nuevas líneas y pestañas 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


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 }


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)") } }


Para convertir un NSDictionary a un NSString:

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


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

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);

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

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];


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

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


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

Consigue el json-framework y haz esto:

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

myDictionary será tu diccionario.


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


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<NSObject> { 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<NSObject, NSObject> { 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 bastante parecido al estilo de impresión original de Objective-C