Ios 即使键路径存在,NSDictionary valueForKeyPath也返回nill
下面是我的应用程序中的两行代码。第一个工作正常,我得到标签上的值“LE-05330”,但第二个我得到零。第二行我做错了什么Ios 即使键路径存在,NSDictionary valueForKeyPath也返回nill,ios,objective-c,json,nsdictionary,Ios,Objective C,Json,Nsdictionary,下面是我的应用程序中的两行代码。第一个工作正常,我得到标签上的值“LE-05330”,但第二个我得到零。第二行我做错了什么 //Working properly self.lblSerialNo.text = [self.PartInfo valueForKeyPath:@"veri.parca_bilgisi.referans_no"]; //valueForKeyPath returns nil so label is empty. self.lblCertNo.text = [self.
//Working properly
self.lblSerialNo.text = [self.PartInfo valueForKeyPath:@"veri.parca_bilgisi.referans_no"];
//valueForKeyPath returns nil so label is empty.
self.lblCertNo.text = [self.PartInfo valueForKeyPath:@"veri.sertifika.sertifika_no"];
self.PartInfo对象上的JSON数据如下所示
{
"durum": true,
"hata": "",
"veri": {
"parca_bilgisi": {
"imaj": "http://www.mywebsite.com:9898/mobapp/images/arac_hasar/arac-onsolkapi.jpg",
"parca_tanimi": "ÖN SOL KAPI",
"marka": "MYBRAND",
"marka_kodu": "70",
"model": "MYMODEL",
"model_kodu": "?",
"yil": "2005",
"uretici": "MYManufacturer.",
"referans_no": "LE-05330",
"oem_no": "999999",
"durum": "3",
"durum_aciklama": "Transferred_to_Supplier"
},
"onarim_servis_bilgileri": {
"servis_adi": "?",
"iletisim_no": "?",
"islem_tarihi": "?",
"hasar_dosya_no": "?"
},
"sigorta_bilgileri": {
"firma_adi": "?",
"iletisim_no": "?",
"ilgili_kisi": "?"
},
"eksper_bilgileri": {
"onaylama_tarihi": "?"
},
"uretici_bilgileri": {
"firma": "My Firm AS.",
"imaj": "harita.jpg",
"adres": "Carrer de Jacint Verdaguer, 58, 08970",
"eposta": "myr@email.es",
"tel": "+36 56565 345 317",
"web": "www.styaasira.es",
"kayit_tarihi": "7.7.2017 13:27:44",
"durum": "3"
},
"sertifika": {
"sertifikasyon_kurulusu": "87",
"sertifika_no": "87",
"gecerlilik_tarihi": "87"
}
}
}
用于检索NSDictionary(dict)的我的代码
我取消了服务调用,并尝试了与字符串相同的JSON,仍然没有机会
NSString *json = ...
NSError *error;
NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableLeaves
error:&error];
self.lblIssuer.text = [dict valueForKeyPath:@"veri.sertifika.sertifikasyon_kurulusu"];
在几次不成功的逻辑尝试之后,我决定将重点放在数据上,并尝试修改(simplfy)JSON对象,并尝试查看它是否适用于不同的键名。因此,我首先将节点的名称从“sertifika”更改为“test”,并将3个子节点的名称更改为“a”、“b”和“c”。在这种状态下,我可以使用valueForKeyPath获取值。然后,我把节点的名称改回原来的名称,它也起作用了!!!然后我注释掉了从常量字符串到服务响应读取JSON,。。。等等。。。它也起作用了
有人能说出发生了什么合乎逻辑的事吗?NSDictionary是否有某种疯狂的哈希机制?无论如何,将失败的节点名称更改为原始名称已经解决了我的问题…能否尝试将其正确转换为NSData。]()使用此选项时会发生什么:
NSDictionary*veri=PartInfo[@“veri”];NSDictionary*sertifika=veri[@“sertifika”];NSString*text=sertifika[@“sertifika_no”];NSLog(@“文本为%@”,文本)代码>能否更新代码以显示如何加载词典?我尝试了上面的json,它对我来说很好。你有什么问题吗else@MostafaTorbjørnBerg刚刚发布了加载代码,但为什么它适用于其他节点而不适用于“sertifika”?@JohnnyRockex它是这样工作的。。。但我需要ValueForkeyPath,您能否尝试将其正确转换为NSData。]()使用此选项时会发生什么:NSDictionary*veri=PartInfo[@“veri”];NSDictionary*sertifika=veri[@“sertifika”];NSString*text=sertifika[@“sertifika_no”];NSLog(@“文本为%@”,文本)代码>能否更新代码以显示如何加载词典?我尝试了上面的json,它对我来说很好。你有什么问题吗else@MostafaTorbjørnBerg刚刚发布了加载代码,但为什么它适用于其他节点而不适用于“sertifika”?@JohnnyRockex它是这样工作的。。。但我需要一条有价值的道路
NSString *json = ...
NSError *error;
NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableLeaves
error:&error];
self.lblIssuer.text = [dict valueForKeyPath:@"veri.sertifika.sertifikasyon_kurulusu"];