OGeek|极客世界-中国程序员成长平台

标题: ios - 从 json 输出为类实例赋值 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 22:39
标题: ios - 从 json 输出为类实例赋值

我正在编写一个代码来创建一个应用程序,其中一组问题及其选项和答案正在通过 json 解析获取。我在 viewDidLoad 方法中做这一切。

这是目前为止的代码。解析代码工作正常。

- (void)viewDidLoad {
[super viewDidLoad];
question *quest = [[question alloc] init];
//Parsing code

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString"http://***/****/fetch.php"]];
[request setHTTPMethod"OST"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data , NSURLResponse *response , NSError *error){
    NSError *err = nil;
    id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&err];
    if (err) {
        [self alertMessage@"%@", err)];
    }
    else {

//Unclear from here   


        NSLog(@"%@", jsonData[@"data"]);
        allData = jsonData[@"data"];
        NSLog(@"%lu",(unsigned long)allData.count);
        int count = allData.count;
        int i = 0;
        while (i < count){
            question *que;
            NSString *q,*a,*o1,*o2,*o3,*o4;
            a = [allData valueForKey"answer"];
            q = [allData valueForKey"question"];
            o1 = [allData valueForKey"option1"];
            o2 = [allData valueForKey"option2"];
            o3 = [allData valueForKey"option3"];
            o4 = [allData valueForKey"option4"];

            //NSLog(@"%@", [allData valueForKey"question"]);
            [que setValue:q forKey"question"];
            [que setValue:a forKey:@"answer"];
            [que setValue1 forKey:@"option1"];
            [que setValue2 forKey:@"option2"];
            [que setValue3 forKey:@"option3"];
            [que setValue4 forKey:@"option4"];
            i++;

            NSLog(@"%@",[que valueForKey:@"question"]);
        }

    }
}] resume];

}

NSLog(@"%@", jsonData[@"data"]); 代码的输出如下所示。

{
        answer = sometext;
        id = 7;
        option1 = sometext;
        option2 = sometext;
        option3 = sometext;
        option4 = sometext;
        question = "sometext";
    },           
        {
        answer = sometext;
        id = 9;
        option1 = sometext;
        option2 = sometext;
        option3 = sometext;
        option4 = sometext;
        question = "sometext";
    }
)

据我了解,这个 json 数据是一个字典数组(?)

我要做的下一步是创建一个“问题”类。我不确定我是否做得对,但这是代码:

#import "question.h"
@implementation question {    
NSString *q;
NSString *a;
NSString *o1;
NSString *o2;
NSString *o3;
NSString *o4;       
}
@end

viewDidLoad 方法的 while 循环中,我正在尝试创建名为 quequestion 类的实例如代码所示填充。 但是 NSLog(@"%@",[que valueForKey:@"question"]); 行在控制台中给出了 null

我确定我使用的方法一定有问题。

第二个问题是我正在创建一个名为 questquestion 数组,我在 viewDidLoad 之后声明了它。但是我将无法在任何其他代码块中使用它,例如按钮的单击事件。如果我尝试在 viewDidLoad 上方使用 question *quest = [[question alloc] init]; 行,则会出现错误:

initialiser 元素不是编译时常量

我知道这不是理想的编码方式,但我仍然是这里的初学者,只是对所有这些新概念感到困惑。我在 Swift 中开发了相同的应用程序,但 Objective C 感觉太难了。 任何帮助将不胜感激。



Best Answer-推荐答案


为了得到你想要的,首先你必须创建一个 NSMutableArray 来存储 Question 类的实例,你必须像这样将它声明为一个全局数组

@interface MyClass ()  {
    NSMutableArray * arrQuestion;
}

现在,在 question.h 中,您必须为所有像这样的变量声明 @property,问题类也将从 NSObject 派生,因为您将其创建为 型号

@interface question : NSObject
@property (nonatomic, strong) NSString *strQuestion;
@property (nonatomic, strong) NSString * strAnswer;
@property (nonatomic, strong) NSString * strOptionA;
@property (nonatomic, strong) NSString * strOptionB;
@property (nonatomic, strong) NSString * strOptionC;
@property (nonatomic, strong) NSString * strOptionD;  
@end

现在在 while 循环中,您必须创建 Question 类的新实例,并且必须像这样在其中分配值

arrQuestion = [NSMutableArray new];
while (i < count){
      question *quest = [[question alloc] init];
      quest.strQuestion = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"question"];
      quest.strAnswer = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"answer"];
      quest.strOptionA = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"option1"];
      quest.strOptionB = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"option2"];
      quest.strOptionC = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"option3"];
      quest.strOptionD = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"option4"];
      i++;
      [arrQuestion addObject:quest];
}

现在从 arrQuestion 你可以访问像这样的值

question *quest = [arrQuestion objectAtIndex:0]; //For Example value at 0 index
NSLog(@"Value of first question - %@", quest. strQuestion);

关于ios - 从 json 输出为类实例赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40211064/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4