【问题标题】:SBJson parse attempt -- objective CSBJson 解析尝试——目标 C
【发布时间】:2012-10-03 00:51:58
【问题描述】:

我正在尝试解析以下 JSon(我认为上次检查时已验证):

{
    "top_level" =     (
                {
            "download" = "http:/target.com/some.zip";
            "other_information" = "other info";
            "notes" =             (
                                {
                    obj1 = "some text";
                    obj2 = "more notes";
                    obj3 = "some more text still";
                }
            );
            title = "name_of_object1";
        },
                {
            "download" = "http:/target.com/some.zip";
            "other_information" = "other info";
            "notes" =             (
                                {
                    obj1 = "some text";
                    obj2 = "more notes";
                    obj3 = "some more text still";
                }
            );
            title = "name_of_object2";
        },
                {
            "download" = "http:/target.com/some.zip";
            "other_information" = "other info";
            "notes" =             (
                                {
                    obj1 = "some text";
                    obj2 = "more notes";
                    obj3 = "some more text still";
                }
            );
            title = "name_of_object3";
        }
    );
}

我的尝试是使用以下内容:

NSDictionary *myParsedJson = [myRawJson JSONValue];

for(id key in myParsedJson) {
    NSString *value = [myParsedJson objectForKey:key];
    NSLog(value);
}

错误:

-[__NSArrayM length]: unrecognized selector sent to instance 0x6bb7b40

问题: 在我看来,JSon 值使 myParsedJson 对象成为 NSArray 而不是 NSDictionary。

如何遍历名为 name_of_object 的对象并访问每个嵌套字典?我的方法正确吗?

【问题讨论】:

  • Jesse 已经给出了我认为正确的答案,我将做出标准的间接相关评论:由于 iOS 5 Apple 提供了内置的 JSON 解析器;您可能出于充分的理由使用它,但不要期望 SBJSON 解析器在未来得到很好的支持。
  • 哦,谢谢汤米;我完全没有意识到这一点。
  • @Tommy,是什么让你这么想?我是 SBJson 的作者,无意停止支持。
  • @StigBrautset 关于使用的简单推测;您现在会看到使用率显着降低,因为您的工作(尽管它很棒)不再具有强大的用例。当项目不再那么重要时,大多数作者会将他们的才能重新投入到一个新项目中。你显然是一个有才华的人,所以我的猜测是你更有可能专注于人们更可能使用的东西。
  • @Tommy 同意了,但它现在已经相当成熟,实际上不需要太多的努力来维护。此外,它还具有 Apple 解析器所没有的功能,因此即使在 iOS 5 及更高版本上它仍然占有一席之地。

标签: iphone objective-c ios ipad sbjson


【解决方案1】:

NSLog 的第一个参数必须是字符串。试试这个:

NSLog(@"%@", value);

【讨论】:

  • 但它已经是一个字符串,因为 value 引用了一个 nsstring 对象?....(运行它一段时间后......它实际上工作)等等......为什么我需要强制转换一个字符串变成一个字符串?
  • 这不是演员表。 NSLog 接受 format 字符串,而不是字符串变量。 %@ 也不意味着“字符串”。它的意思是“对象”
  • 只是为了澄清@borrrden 的声明:将格式字符串保留在变量中是完全可以的,但如果您尝试打印您无法控制的数据,则不使用它是不安全的,因为有人可以制作一个会使您的应用崩溃的格式字符串。
【解决方案2】:

您的value 不是字符串,只是因为您输入了它。 根据您发布的结构,您将拥有一个数组作为您的 顶级对象。

NSDictionary *myParsedJson = [myRawJson JSONValue];
for(id key in myParsedJson) {
    id value = [myParsedJson objectForKey:key];
    NSLog(@"%@", value);
}

NSLog 中的%@ 语法导致-description 方法被 呼吁价值;此方法返回一个 NSString。这意味着 你可以NSLog([value description]);,但这是 通常不是一个好主意。 (有人可能会制作可能导致您的应用崩溃的恶意输入。)

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多