我在解析一些JSON数据时遇到问题,这些数据包含嵌套数组中的嵌套数组。我尝试解析的单个JSON对象如下所示:
{
"date":1454284800,
"exercises":[
{
"name":"Tricep Skull-Crushers",
"sets":"5",
"reps":"12",
"time":"20",
"weight":"",
"notes":"testing testing again testing this app which is great "
},
{
"name":"Barbell Squat",
"sets":"3",
"reps":"12",
"time":"",
"weight":"45",
"notes":"some notes"
}
]
}
我希望将这些对象中的任意数量解析为NSDictionary
。我以前用JSON
数据成功完成了这项工作,而不是嵌套数组中的嵌套数组。我目前正在使用NSURLSessionDataTask
从URL中检索数据,一旦我获得了数据,我将其转换为NSDictionary
并使用以下代码将数据拆分为数组:
theDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];
self.namesArray = [[NSMutableArray alloc] init];
self.setsArray = [[NSMutableArray alloc] init];
self.repsArray = [[NSMutableArray alloc] init];
for (NSDictionary *dict in theDictionary) {
[self.namesArray addObject:[dict objectForKey:@"name"]];
[self.setsArray addObject:[dict objectForKey:@"sets"]];
[self.repsArray addObject:[dict objectForKey:@"reps"]];
}
此代码在以前解析JSON数据时有效,虽然我可以正确地返回数据和响应字符串,但每当我尝试将数据转换为NSDictionary
或NSArray
时,它仍然会返回{{1 }}。就像我说的那样,这段代码以前用于解析NULL
,但没有用JSON
对象中的那么多嵌套数组。
有人可以就如何实现这个目的向我提出一些建议吗?
编辑:
我已经发布了下面的完整响应字符串,我收到了上面示例的多个对象。如果有人想在JSON Editor Online中查看此内容,请查看完整回复的外观:
JSON
答案 0 :(得分:0)
所以我们终于找到了问题。似乎JSON解析换行符(\ n)有问题。我要做的是将JSON数据转换为字符串,删除任何换行符(\ n),然后将字符串转换回数据并将其转换为NSDictionary。有点烦人的是,这花了一天时间才弄清楚是非常简单的事情,但这是我正在使用的最终代码。希望这有助于任何陷入类似问题的人。
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
NSData *dataWithoutLineBreaks = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *jsonError;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:dataWithoutLineBreaks options:NSJSONReadingMutableContainers error:&jsonError];
答案 1 :(得分:-1)
您的代码中的所有内容都可以,只需对for循环进行微小更改
for (NSDictionary *dict in theDictionary[@"exercises"])
{
[self.namesArray addObject:[dict objectForKey:@"name"]];
[self.setsArray addObject:[dict objectForKey:@"sets"]];
[self.repsArray addObject:[dict objectForKey:@"reps"]];
}
答案 2 :(得分:-1)
这是你在swift中写的答案:
do {
let json = try NSJsonSerialization.jsonObjectWithDat(jsondata, options: .AllFragments)
for var i = 0 ; i < json.count ; i++ {
if let item = json[i] {
if let date = item["date"]{//do anything}
if let experience = item["experience"] {
for ex in experience {
let name = experience["name"]
let step = experience["step"]
let reps = experience["reps"]
let time = experience["time"]
let weight = experience["weight"]
let notes = experience["notes"]
}
}
} catch err as NSError {
print(err)
}