如何将印刷字典转换为NSDictionary?

时间:2016-06-02 10:52:04

标签: ios objective-c nsstring nsdictionary

当我NSLog字典输出是这样的:

{
    accounts =     (
                {
            "account_number" = 9000012;
            "account_type" = "Saver Account";
            ato = 0;
            balance = "0.0";
        },
                {
            "account_number" = 9000010;
            "account_type" = "Primary Account";
            ato = 0;
            balance = "100000.0";
        }
    );
}

现在我需要在另一个程序中使用相同的字典(在我的测试中嘲笑)。 如何将此值从复制粘贴从控制台分配给NSDictionary?

我尝试将其作为NSString,因为这个答案解释

NSString *jsonStr = @" { ({\"account_number\" = 9000012; \"account_type\" = \"Saver Account\"; ato = 0; balance = \"0.0\";});}";
NSData *data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
return dict;

Converting NSString to NSDictionary / JSON

但是这会返回null。

我再次将=替换为:并尝试

NSString *jsonStr = @" { ({\"account_number\" : 9000012; \"account_type\" : \"Saver Account\"; ato : 0; balance : \"0.0\";});}";

但还是不行?

已更新

我设法以这种方式转换:

NSDictionary *account = @{ @"account_type":@"Account Type XXX",
                           @"account_number":@"Account Number 123" };

NSMutableDictionary *mainDict = [[NSMutableDictionary alloc] init];
[mainDict setValue:@[account] forKey:@"accounts"];

对于两个阵列:

NSDictionary *account1 = @{ @"account_type":@"Account Type XXX",
                           @"account_number":@"Account Number 123" };

NSDictionary *account2 = @{ @"account_type":@"Account Type YYY",
                           @"account_number":@"Account Number 456" };


NSMutableDictionary *mainDict = [[NSMutableDictionary alloc] init];
[mainDict setValue:@[account1,account2] forKey:@"accounts"];
但是@Duncan C声称这种方式并不安全!

3 个答案:

答案 0 :(得分:2)

不要这样做。 NSLog的输出不是任何特定格式,并且不保证在OS版本之间保持一致。您将不得不编写一堆自定义代码,它将是脆弱的,并且可能会破坏任何操作系统更改。

你应该编写一个函数来获取你的字典并将其输出为漂亮的JSON。另外编写另一个函数,将JSON作为输入并返回一个字典。然后从调试器中调用这些函数。

编辑:

我创建了一个定义NSDictionary类别NSDictionary+JSON

的Github项目

DictionaryToJSON project on Github

如果您在项目中添加NSDictionary+JSON.hNSDictionary+JSON.m,并在任何使用它的文件中添加#import标题,则可以在调试器中键入这样的行:

e [someDictionary jsonString]

这将采用someDictionary并将其转换为JSON字符串。它还会转义字符串中的任何引号,以便您可以复制/粘贴它,然后您可以转到其他程序(也包含类别)并键入

e dict = [NSDictionary dictionaryFromJSONString: @"<the JSON string>"]

(将"<the JSON string>"替换为您从上一个调试器命令获得的实际JSON字符串。

请注意,为了能够将JSON从调试器控制台复制/粘贴到调试器命令中,我必须将JSON数据中的任何引号转义为\"

答案 1 :(得分:0)

在控制台中打印字典时,它不会以JSON格式打印。因此,您必须将字典转换为JSON字符串,然后您才能将其返回NSDictionary。您可以使用这些辅助方法(将对象转换为JSON字符串,将其转换回对象):

+ (NSData *)dataFromJSONObject:(id)object {
    NSError *error = nil;
    NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:&error];

    return data;
}

+ (NSString *)stringFromJSONObject:(id)object {
    NSData *data = [self dataFromJSONObject:object];
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

+ (id)JSONObjectFromData:(NSData *)data {
    NSError *error = nil;
    id object = [NSJSONSerialization JSONObjectWithData:data
                                                options:0
                                                  error:&error];
    if (!object || error != nil) {
    }

    return object;
}

+ (id)JSONObjectFromString:(NSString *)string {
    return [self JSONObjectFromData:[string dataUsingEncoding:NSUTF8StringEncoding]];
}

答案 2 :(得分:0)

在App捆绑包中添加JSON类型文件并以编程方式读取。

以下是如何做到这一点:

(1)打开TextEdit并创建新文档。

(2)在该空文档中, PASTE Web服务的响应。我使用Postman来获取响应。它是JSON格式。您可以使用任何JSON字符串(在您的情况下来自其他项目..)。

(3)点击格式&gt; 制作纯文本

(4)另存为:&#34; yourFileName.json&#34; enter image description here

(5)现在,只需将此json文件放入App包中即可。

(6)阅读内容:

NSString  *filePath = [[NSBundle mainBundle] pathForResource:@"yourFileName" ofType:@"json"];
NSData    *jsonData = [[NSData alloc] initWithContentsOfFile:filePath];

NSError         *error = nil;
NSDictionary    *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
NSMutableArray  *arrUsers = jsonDict[kData];

(7)享受:D