Генерация строки JSON из NSDictionary в iOS

298

У меня есть dictionary Мне нужно сгенерировать JSON string с помощью dictionary. Можно ли его преобразовать? Можете ли вы, ребята, помочь в этом?

  • 3
    @RicardoRivaldo что это
  • 16
    кто-нибудь пришел сюда из поиска Google, пожалуйста, прочитайте ответ ниже @Guillaume
Теги:
string

12 ответов

188
Лучший ответ

Вот категории для NSArray и NSDictionary, чтобы сделать это супер-легким. Я добавил параметр для довольно-печати (новые строки и вкладки, чтобы их было легче читать).

@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(@"bv_jsonStringWithPrettyPrint: error: %@", 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(@"bv_jsonStringWithPrettyPrint: error: %@", error.localizedDescription);
        return @"[]";
    } else {
        return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
}
@end
  • 8
    если мы создадим категорию NSObject и поместим один и тот же метод, он будет работать как для NSArray, так и для NSDictionary. Не нужно писать два отдельных файла / интерфейса. И он должен вернуть ноль в случае ошибки.
  • 0
    Почему вы предполагаете, что NSUTF8StringEncoding является правильной кодировкой?
Показать ещё 2 комментария
654

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];
}
  • 83
    Это хороший совет ... очень раздражает, что в проектах есть куча сторонних библиотек.
  • 3
    Превосходное решение для преобразования в JSON Object. Отличная работа..:)
Показать ещё 4 комментария
54

Чтобы преобразовать NSDictionary в NSString:

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

ПРИМЕЧАНИЕ. Этот ответ был дан до выхода iOS 5.

Получите json-framework и сделайте следующее:

#import "SBJsonWriter.h"

...

SBJsonWriter *jsonWriter = [[SBJsonWriter alloc] init];

NSString *jsonString = [jsonWriter stringWithObject:myDictionary];  

[jsonWriter release];

myDictionary будет вашим словарем.

  • 0
    Спасибо за ваш ответ. Подскажите, пожалуйста, как добавить фреймворк в мое приложение. Похоже, в stig-json-framework-36b738f так много папок.
  • 0
    @ChandraSekhar после клонирования репозитория git достаточно добавить папку Classes / в ваш проект.
Показать ещё 1 комментарий
22

Вы также можете сделать это "на лету", введя следующее в отладчик

po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:yourDictionary options:1 error:nil] encoding:4];
  • 4
    Жестко закодированные константы немного страшны. Почему бы не использовать NSUTF8StringEncoding и т. Д.?
  • 5
    Это в настоящее время не работает в LLDB: error: use of undeclared identifier 'NSUTF8StringEncoding'
Показать ещё 1 комментарий
11
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];
  • 0
    Когда я передаю это в запрос POST в качестве параметра, я получаю +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write' error. Использование XCode 9.0
10

Вы можете передать массив или словарь. Здесь я беру 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);
7

В 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
}
3

Теперь нет необходимости в сторонних классах 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.

1

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

Как и по ISO7, вы можете легко сделать это с помощью NSJSONSerialization.

  • 0
    это действительно доступно начиная с iOS 5.0, а не 7.0, по ссылке.
0
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню