当前位置: 首页 > 面试题库 >

Cocoa-Touch-如何解析本地Json文件

锺离自明
2023-03-14
问题内容

我是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"]);
}

我在此站点上找到了一个示例,但出现以下错误

-JSONValue失败。错误是:对象键后不期望令牌“值分隔符”。


问题答案:

JSON具有严格的键/值表示法,用于R4和响应的键/值对不正确。试试这个:

NSString *jsonString = @"{\"quizz\":[{\"id\":\"1\",\"Q1\":\"When Mickey was born\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"response\":\"1920\"}]}";

如果您从文件中读取字符串,则不需要所有的斜杠。
文件将如下所示:

{“ 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"]);
}

我的印象是,您复制了旧代码,因为您没有使用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"]);
}

甚至是基于块的枚举的爱好者,如果需要快速安全的枚举,还需要另外一个索引。

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"]);
}];


 类似资料:
  • UIViewController(视图控制器),顾名思义,是 MVC 设计模式中的控制器部分。UIViewController 在 UIKit 中主要功能是用于控制画面的切换,其中的 view 属性(UIView 类型)管理整个画面的外观。 UIViewController 生命周期 ViewController 生命周期的第一步是初始化。不过具体调用的方法还有所不同。如果使用 StoryBoar

  • UIView 表示屏幕上的一块矩形区域,负责渲染区域的内容,并且响应该区域内发生的触摸事件。它在iOS App中占有绝对重要的地位,因为iOS中几乎所有可视化控件都是 UIView 的子类。 UIView 可以负责以下几种任务: 绘制和动画 布局和子视图管理 事件处理 绘制和动画 视图绘制 UIView 是按需绘制的,当整个视图或者视图的一部分由于布局变化,变成可见的,系统会要求视图进行绘制。对于

  • UIApplication 的核心作用是提供了 iOS 程序运行期间的控制和协作工作。 每一个程序在运行期必须有且仅有一个 UIApplication(或则其子类)的一个实例。在程序开始运行的时候,UIApplicationMain 函数是程序进入点,这个函数做了很多工作,其中一个重要的工作就是创建一个 UIApplication 的单例实例。在你的代码中你,你可以通过调用 [UIApplicat

  • 生成条码的iOS类库。 开发者注:测试很简单。 self.view.backgroundColor = [UIColor whiteColor]; UIImage *image = [UIImage imageFromBarcode:[[NKDEAN13Barcode alloc] initWithContent:@“6917878002446”]]; UIImageView *imageview

  • 离屏渲染 离屏渲染往往会带来界面卡顿的问题,这里将会讨论 当前屏幕渲染、离屏渲染 以及 CPU 渲染 在 OpenGL 中,GPU 屏幕渲染有以下两种方式: On-Screen Rendering 即当前屏幕渲染,在用于显示的屏幕缓冲区中进行,不需要额外创建新的缓存,也不需要开启新的上下文,所以性能较好,但是受到缓存大小限制等因素,一些复杂的操作无法完成。 Off-Screen Rendering

  • Core Animation 注:示例中部分代码的完整版可以在这里找到。 UIView Animation 简单动画 对于 UIView 上简单的动画,iOS 提供了很方便的函数: + animateWithDuration:animations: 第一个参数是动画的持续时间,第二个参数是一个 block,在 animations block 中对 UIView 的属性进行调整,设置 UIView