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 - 键是一个数字,我可以通过偏移来获取孩子吗?的主要内容,如果未能解决你的问题,请参考以下文章