13 ответов:
вот категории для NSArray и NSDictionary, чтобы сделать это супер-легко. Я добавил опцию для pretty-print (новые строки и вкладки, чтобы облегчить чтение).
@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 добавила парсер JSON и сериализатор в iOS 5.0 и Mac OS X 10.7. Смотрите NSJSONSerialization.
чтобы создать строку JSON из NSDictionary или NSArray, вам больше не нужно импортировать какую-либо стороннюю структуру.
вот как это сделать:
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]; }
чтобы преобразовать NSDictionary в NSString:
NSError * err; NSData * jsonData = [NSJSONSerialization dataWithJSONObject:myDictionary options:0 error:&err]; NSString * myString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
Примечание: этот ответ был дан до выхода iOS 5.
скачать в JSON-структуры и этого:
#import "SBJsonWriter.h" ... SBJsonWriter *jsonWriter = [[SBJsonWriter alloc] init]; NSString *jsonString = [jsonWriter stringWithObject:myDictionary]; [jsonWriter release];
myDictionaryбудет твой словарь.
вы также можете сделать это на-лету, введя следующее в отладчике
po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:yourDictionary options:1 error:nil] encoding:4];
Вы можете передать массив или словарь. Здесь я беру NSMutableDictionary.
NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc]init]; [contentDictionary setValue:@"a" forKey:@"b"]; [contentDictionary setValue:@"c" forKey:@"d"];чтобы создать строку JSON из NSDictionary или NSArray, вам не нужно импортировать какую-либо стороннюю структуру. Просто используйте следующий код:-
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];
In Swift (версия 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 }
теперь нет необходимости в сторонних классах ios 5 введена 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);этот код может быть полезен для получения jsondata.
в Swift, я создал следующую вспомогательную функцию:
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)") } }
начиная с ISO7, по крайней мере, вы можете легко сделать это с 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<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) } } }Это довольно близко к оригинальной Objective - C Print style
здесь 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 } }}
Пример Использования
do{ let jsonString = try dic.toString() } catch( let error){ print(error.localizedDescription) }или если вы уверены, что это правильный словарь, то вы можете использовать
let jsonString = try? dic.toString()
Comments