JSON文件解析给出对象名称而不是内容[关闭]

Posted

技术标签:

【中文标题】JSON文件解析给出对象名称而不是内容[关闭]【英文标题】:JSON file parsing gives object name rather contents [closed] 【发布时间】:2014-11-19 00:28:24 【问题描述】:

我确实有一个我在这里创建的 JSON 文件:http://www.jsoneditoronline.org/?id=d0b62425c78f98db2398ed558f92e5cf

简单地说,我将此文件添加到我的项目中并尝试解析它。出于某种原因,NSLog 行给了我“语句”而不是语句对象。我期待它给我整个声明对象字典。我显然在这里遗漏了一些东西。我将不胜感激。

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"math" ofType:@"json"];
NSData *JSONData = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:nil];
NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableContainers error:nil];

 NSLog(@"jsonObject is %@", jsonObject); //this gives me the whole JSON object correctly.

for (NSDictionary *dict in jsonObject[@"statements"]) 
        NSLog(@"dict is %@", dict);


【问题讨论】:

这个的输出是什么:` NSLog(@"dict is %@", dict);` ? 当您遍历字典时,返回的值就是键。 @MidhunMP 输出是“语句” (那是奇怪的 JSON。通常人们会期望“语句”是一个对象数组,而不仅仅是一个对象。) (你得到了预期的结果,考虑到扭曲的 JSON。) 【参考方案1】:

那是糟糕的 JSON。通常人们会期望“语句”的值是一个对象数组,而不仅仅是一个对象。当您在字典(JSON“对象”)上进行迭代时,您会遍历键,因此您会得到预期的结果。

【讨论】:

谢谢,关于我的 JSON 的一个问题。所以我改变了它,现在在我的 for 循环中当我做 NSLog(@"dict is %@", dict[@"expression"]);我得到NULL。如果我这样做 NSLog(@"dict is %@", dict[@"statement"]);但是,我得到了我想要的语句对象。这不是多余的吗?我的 JSON 结构是否不好?提前致谢。 @ilteris - “表达式”在“语句”内。要访问“表达式”,您必须首先获取“语句”的字典。 换句话说 for (NSDictionary *dict in jsonObject[@"statements"]) 我假设我已经在遍历我的语句对象。为什么我还需要用 dict[@"statement"] 引用它们? @ilteris - 我不知道你是如何重组你的 JSON 的,但是如果“语句”包含一个字典数组,并且每个字典都包含一个“语句”元素,并且该元素包含一个“表达式”元素,您必须按该顺序“剥洋葱”。 在我看来,包含“statement”的字典不包含任何其他内容,因此您可以删除该字典并直接将包含“expression”的字典包含在您的“statements”数组中。

以上是关于JSON文件解析给出对象名称而不是内容[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

解析 Json 数据。嵌套对象给出错误

PHP file_exists 内容而不是名称?

[对象值使用JSON解析显示具有相同名称的对象和字符串

在 Nodejs 中解析大型 JSON 文件并独立处理每个对象

fs.writeFile() 在关闭脚本时写入 [object, object] 而不是实际的对象

Angular 7检查JSON解析是不是返回特定对象的正确方法[关闭]