如何解析嵌套的 JSON 对象?
Posted
技术标签:
【中文标题】如何解析嵌套的 JSON 对象?【英文标题】:How to parse nested JSON objects? 【发布时间】:2014-02-26 03:34:38 【问题描述】:我得到这样的 JSON 格式:
stream( posts: [CHANNEL: ios: "(format=m3u8-aapl).m3u8" ])
我想要得到的是“ios”的数组。 这是我的代码:
id jsonObjects = [NSJSONSerialization JSONObjectWithData:
jsonSource options:NSJSONReadingMutableContainers error:nil];
for (NSDictionary *dataDict in jsonObjects)
NSArray *ios_data = [[[dataDict objectForKey:@"posts"] objectForKey:@"CHANNEL"] objectForKey:@"ios"];
NSLog(@"%@",ios_data);
dict = [NSDictionary dictionaryWithObjectsAndKeys:ios_data, ios,nil];
但是它返回NULL,有什么问题吗?
【问题讨论】:
以上不是合法的JSON,也不是iOS中解析后的JSON的表示。 并且 JSONObjectWithData 有一个error:
参数。好好利用!!!
(有关 JSON 语法的描述,请参见 json.org。主要是上面缺少键名周围的引号。)
【参考方案1】:
你的“JSON”:
stream( posts: [CHANNEL: ios: "(format=m3u8-aapl).m3u8" ])
不是 JSON。您可以尝试通过 http://jsonlint.com/ 之类的验证器运行它来测试它。
另外,你应该创建一个 NSError 引用来传递而不是nil
,这样 NSJSONSerialization 可以向你提供一个错误对象。这将有助于您的调试。
如果您的数据是有效的 JSON,下面是一个示例:
"stream": [
"posts": [
"CHANNEL":
"ios": "(format=m3u8-aapl).m3u8"
]
]
(我把它隔开是为了更易读,但是这个间距对于解析来说是不必要的。)
【讨论】:
【参考方案2】:一旦你的数组保存了“帖子”,你可以像这样向下钻取:
NSArray *fileData = [myDic1 valueForKeyPath:@"posts.CHANNEL"];
然后像这样访问:
for (int i=0; i < [clientFileData count]; i++)
NSDictionary *myDictionary = [fileData objectAtIndex:i];
]
另外,除非我错了,否则您的 JSON 文件似乎格式不正确。
【讨论】:
谢谢,是关于我的回调json的。【参考方案3】:得到你的回应:
NSDictionary *dictionaryData = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
正确的JSOn应该是这样的
"posts":[
"CHANNEL":
"ios":"(format=m3u8-aapl).m3u8"
]
获取正确格式的 JSON,然后尝试解析它。你做错的一件事是 POST 是一个数组。
【讨论】:
非常感谢 Rashad,我想我会请求一些第三方来修复格式或请求其他方式来解析它的数据。以上是关于如何解析嵌套的 JSON 对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何从通过 Moya.Response 查询返回的对象解析嵌套的 JSON 数组
如何通过改造将数组嵌套对象 Json 解析为 Kotlin?