Sku*_*ies 13 cocoa-touch json objective-c ios
我是iOS开发新手,我正在尝试解析一个本地Json文件,如
{"quizz":[{"id":"1","Q1":"When Mickey was born","R1":"1920","R2":"1965","R3":"1923","R4","1234","response","1920"},{"id":"1","Q1":"When start the cold war","R1":"1920","R2":"1965","R3":"1923","rep4","1234","reponse","1920"}]}
这是我的代码:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];
// Parse the string into JSON
NSDictionary *json = [myJSON JSONValue];
// Get all object
NSArray *items = [json valueForKeyPath:@"quizz"];
NSEnumerator *enumerator = [items objectEnumerator];
NSDictionary* item;
while (item = (NSDictionary*)[enumerator nextObject]) {
NSLog(@"clientId = %@", [item objectForKey:@"id"]);
NSLog(@"clientName = %@",[item objectForKey:@"Q1"]);
NSLog(@"job = %@", [item objectForKey:@"Q2"]);
}
Run Code Online (Sandbox Code Playgroud)
我在这个网站上找到了一个样本,但是我收到了以下错误
-JSONValue失败.错误是:在对象键之后不期望令牌'值分隔符'.
Vik*_*ica 14
JSON具有严格的键/值表示法,R4和响应的键/值对不正确.试试这个:
NSString *jsonString = @"{\"quizz\":[{\"id\":\"1\",\"Q1\":\"When Mickey was born\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"response\":\"1920\"}]}";
Run Code Online (Sandbox Code Playgroud)
如果您从文件中读取字符串,则不需要所有斜杠
您的文件将是这样的:
{"quizz":[{"id":"1","Q1":"当米奇出生时","R1":"1920","R2":"1965","R3":"1923", "R4":"1234","响应":"1920"},{"id":"1","Q1":"开始冷战时","R1":"1920","R2": "1965年", "R3": "1923", "R4": "1234", "效应初探": "1920"}]}
我测试了这段代码:
NSString *jsonString = @"{\"quizz\":[{\"id\":\"1\",\"Q1\":\"When Mickey was born\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"response\":\"1920\"}, {\"id\":\"1\",\"Q1\":\"When start the cold war\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"reponse\":\"1920\"}]}";
NSLog(@"%@", jsonString);
NSError *error = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error];
NSArray *items = [json valueForKeyPath:@"quizz"];
NSEnumerator *enumerator = [items objectEnumerator];
NSDictionary* item;
while (item = (NSDictionary*)[enumerator nextObject]) {
NSLog(@"clientId = %@", [item objectForKey:@"id"]);
NSLog(@"clientName = %@",[item objectForKey:@"Q1"]);
NSLog(@"job = %@", [item objectForKey:@"Q2"]);
}
Run Code Online (Sandbox Code Playgroud)
我得到的印象是,您复制了旧代码,因为您没有使用Apple的序列化和Enumerator而不是Fast Enumeration.整个枚举的东西可以简单地写成
NSArray *items = [json valueForKeyPath:@"quizz"];
for (NSDictionary *item in items) {
NSLog(@"clientId = %@", [item objectForKey:@"id"]);
NSLog(@"clientName = %@",[item objectForKey:@"Q1"]);
NSLog(@"job = %@", [item objectForKey:@"Q2"]);
}
Run Code Online (Sandbox Code Playgroud)
或者甚至是基于块的枚举的发烧友,如果需要快速安全的枚举,你还有一个索引.
NSArray *items = [json valueForKeyPath:@"quizz"];
[items enumerateObjectsUsingBlock:^(NSDictionary *item , NSUInteger idx, BOOL *stop) {
NSLog(@"clientId = %@", [item objectForKey:@"id"]);
NSLog(@"clientName = %@",[item objectForKey:@"Q1"]);
NSLog(@"job = %@", [item objectForKey:@"Q2"]);
}];
Run Code Online (Sandbox Code Playgroud)