【问题标题】:How to convert printed dictionary to NSDictionary?如何将打印的字典转换为 NSDictionary?
【发布时间】:2016-10-02 01:38:16
【问题描述】:

当我 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 声称这种方式不安全!

【问题讨论】:

  • 如果您需要一些静态数据,您的更新方式很好。
  • @Wolverine 是的,我需要这个来模拟服务器响应以进行单元测试。
  • 那么您的更新方法没有害处。

标签: ios objective-c nsstring nsdictionary


【解决方案1】:

不要那样做。 NSLog 的输出没有任何特定的格式,并且不能保证在操作系统版本之间保持一致。您将不得不编写一堆自定义代码,而且它很脆弱,并且会因任何操作系统更改而中断。

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

编辑:

我创建了一个 Github 项目,它定义了一个 NSDictionary 类别NSDictionary+JSON

DictionaryToJSON project on Github

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

e [someDictionary jsonString]

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

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

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

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

【讨论】:

  • 不确定一致性。我将它用于我需要 mcok 服务器 calla 的测试。实际上我现在设法转换,但正如你所说的格式会改变!如何将 NSDictionary 打印为 JSON 格式?
  • 我已经告诉过你了。在代码中编写一个函数,将字典作为输入并返回 JSON 数据。从调试器调用该函数并将结果输出到控制台。 (是的,您可以从调试器中调用您的程序代码。)
  • 查看我的答案的编辑。我创建了一个项目,它在 NSdictionary 中定义了一个类别来做你想做的事。
【解决方案2】:

在您的 App bundle 中添加一个 JSON 类型文件并以编程方式读取它。

你可以这样做:

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

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

(3) 点击格式化 > 制作纯文本

(4) 另存为:"yourFileName.json"

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

(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

【讨论】:

    【解决方案3】:

    当您在控制台打印字典时,它不会以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]];
    }
    

    【讨论】:

    • 在打印字典之前,使用stringFromJSONObject 方法将其转换为JSON。您可以使用JSONObjectFromString 将其转换回 NSDictionary
    • 打印的字典仅用于测试/调试。永远不要使用它或用它做任何事情。如果需要使用 NSDictionary 作为 String,将其转换为 JSON,以便以后处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多