JSONModel - 键是一个数字,我可以通过偏移来获取孩子吗?

Posted

技术标签:

【中文标题】JSONModel - 键是一个数字,我可以通过偏移来获取孩子吗?【英文标题】:JSONModel - Key is a number, can I get the children by offset? 【发布时间】:2014-02-03 00:45:40 【问题描述】:

如何在 Objective C 中解析这个 JSON?我一直用jsonmodel.com的代码来解析。

    
   "found":10958,
   "start":3141,
   "hits":[
      
         "pid":"76493",
         "title":"Beton Armu00e9",
         "artist":"Raiden",
         "genre":"Dubstep",
         "image":"A76493_BetonArm_BetonArm.jpg",
         "label":"Offkey",
         "year":"2011",
         "price":9.99,
         "release":"Beton Armu00e9",
         "type":"Album",
         "tracks":
            "0":
               "name":"Barbican",
               "file":"A76481_Barbican.mp3",
               "tracknum":1,
               "pid":"76481"
            ,
            "1":
               "name":"Trinity",
               "file":"A76482_Trinity.mp3",
               "tracknum":2,
               "pid":"76482"
            ,
            "2":
               "name":"Tricorn",
               "file":"A76483_Tricorn.mp3",
               "tracknum":3,
               "pid":"76483"
            ,
            "3":
               "name":"Brutalist",
               "file":"A76484_Brutalist.mp3",
               "tracknum":4,
               "pid":"76484"
            ,
            "4":
               "name":"Trellick",
               "file":"A76485_Trellick.mp3",
               "tracknum":5,
               "pid":"76485"
            
         
      
   ]

JSONModel 需要一个指针字符串来声明键,但这里的键是数字。这是我需要的,但不起作用:

#import "JSONModel.h"
#import "songParentModel.h"

@protocol albumModel @end

@interface albumModel : JSONModel

@property (strong,nonatomic) NSString *title;
@property (strong,nonatomic) NSString *image;
@property (strong,nonatomic) NSString *artist;
@property (strong,nonatomic) songParentModel *0; // THIS DOESN'T WORK (of course)

@end

我只需要获得第一首曲目,但如果知道如何获得所有曲目,那就太好了。

我对解决方案的最佳猜测是停止使用 JSONModel 并使用其他一些简化的方法解析 JSON。

【问题讨论】:

嗯,首先这不是 JSON。即使解析成字典和数组,也会有一个前导(并且非常重要)( 所以你一定猜到你已经放弃了最外面的 并且有一本字典字典。外层字典只有一个元素“tracks”,即字典,它包含名为“0”、“1”、“2”的元素……它们也是字典。它们包含名为“file”、“name”、“pid”、“tracknum”的元素。因此,一次参考一本字典,直到您剥去足够多的洋葱层以获取您想要的数据。 抱歉,在我这个问题的初稿中,我粘贴了解析后的 JSON 的 xCode 输出。那是个错误。我已将其替换为实际 JSON 的 sn-p。 Hot Licks:我了解如何将它用于不仅仅是数字的键,但问题是我无法创建名为 *0 的指针,那么如何指定第一个孩子? 为什么需要创建一个名为*0的指针?您不必将字典条目提取到名称与键匹配的变量中。只需获取“trackData”,或者,如果必须,“track0”。 【参考方案1】:

像这样创建一个类:

标题:

#import "JSONModel.h"

@protocol Track @end

@interface Track : JSONModel

@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) NSString* file;
@property (assign, nonatomic) int tracknum;
@property (strong, nonatomic) int pid;

@end

将实现保留为默认值。 现在在你的模型中添加这个属性:

@property (strong, nonatomic) NSArray<Track>* allTracks;

同时更改+(JSONKeyMapper*)keyMapper 的实现并将以下项目添加到您的字典中。

+(JSONKeyMapper*)keyMapper

return [[JSONKeyMapper alloc] initWithDictionary:@
        @"tracks":@"allTracks",
        ];

通过这种方式,您可以获得所有曲目的数组,您还可以获得每个曲目的所有详细信息。

【讨论】:

如何处理每个轨道都在标有其轨道号的父项中的事实? “allTracks”不是关键,关键是数字零 (0)。当我尝试您的代码时,我收到了这个明显的错误:“传入数据无效 [albumModel initWithDictionary:]。缺少键:( allTracks )” 你如何初始化你的模型?我认为您初始化模型的方式存在问题。例如查看此链接:jsonviewer.stack.hu/#http://gdata.youtube.com/feeds/api/… 这里的“条目”就像您的“轨道”,我解析这个 json 并获取所有条目的方式是像这样初始化我的模型:self.videosArray = [VideoModel arrayOfModelsFromDictionaries:json[@"饲料"][@"条目"] ];然后遍历我所有的 VideoModel。如果您认为这种方法适合您,我可以向您展示我的 VideoModel 的确切实现。 感谢您的帮助。我放弃了 JSONModel 库。我想你可能错过了我遇到的关键问题。您的所有回复都没有真正解决问题。

以上是关于JSONModel - 键是一个数字,我可以通过偏移来获取孩子吗?的主要内容,如果未能解决你的问题,请参考以下文章

表数组中的 VLOOKUP 键是一个公式

JsonModel 映射问题

iOS中JSONModel的使用

带有 MagicalRecord 的 JSONModel

无法从 JSONModel 初始化模型。我得到零值

JSONModel的使用