jjzjj

ios - 从 json 输出中为类实例赋值

coder 2024-01-18 原文

我正在编写一个代码来创建一个应用程序,其中一组问题及其选项和答案正在通过 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:@"POST"];
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 setValue:o1 forKey:@"option1"];
            [que setValue:o2 forKey:@"option2"];
            [que setValue:o3 forKey:@"option3"];
            [que setValue:o4 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 之后声明它。但是那样我就不能在任何其他代码块中使用它,比如按钮的单击事件。如果我尝试使用 question *quest = [[question alloc] init]; 上面的行 viewDidLoad 它给出了一个错误:

initialiser 元素不是编译时常量

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

最佳答案

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

@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/

有关ios - 从 json 输出中为类实例赋值的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  5. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  6. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  7. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  10. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

随机推荐