gpt4 book ai didi

ios - 来自NSMutableArray的 objective-c JSON解析

转载 作者:行者123 更新时间:2023-12-01 18:05:43 36 4
gpt4 key购买 nike

我有一个如下所示的JSON(从URL获取)-

{
action :getAllJournal;
data :{
journalList :[{
cancelled : F;
"cust_code" : "700-T022";
"journal_amount" : 2216;
"journal_code" : "JV1603/001";
"journal_date" : "2016-03-15 00:00:00";
"journal_id" : 1;
outstanding : 0;
},
{
cancelled : F;
"cust_code" : "700-0380";
"journal_amount" : 120;
"journal_code" : "JV1605/006";
"journal_date" : "2016-05-31 00:00:00";
"journal_id" : 2;
outstanding : 120;
},
{
cancelled : F;
"cust_code" : "700-T280";
"journal_amount" : 57;
"journal_code" : "JV1609/001";
"journal_date" : "2016-09-22 00:00:00";
"journal_id" : 3;
outstanding : 0;
}
];
};
message = "";
"message_code" = "";
result = 1;}

下面执行的代码是从URL获取JSON并将其存储在NSMutableArray中。在将它们存储到数组之前,它可以正常工作,但是我对JSON格式有点困惑,并且不知道如何通过键来获取结果。
__block NSMutableArray *jsonArray = nil;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
NSString *urlString = [NSString stringWithFormat:@"http://xxxxxxx/api.php?action=getAllJournal"];
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError)
{
if (data)
{
id myJSON;
@try {
myJSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}
@catch (NSException *exception) {
}
@finally {
}
jsonArray = (NSMutableArray *)myJSON;

NSString *nsstring = [jsonArray description];
NSLog(@"IN STRING -> %@",nsstring);

NSData *data = [nsstring dataUsingEncoding:NSUTF8StringEncoding];
NSError *jsonError;
NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];
if(jsonObject !=nil){

if(![[jsonObject objectForKey:@"journalList"] isEqual:@""]){

NSMutableArray *array=[jsonObject objectForKey:@"journalList"];

NSLog(@"array: %lu",(unsigned long)array.count);

int k = 0;
for(int z = 0; z<array.count;z++){

NSString *strfd = [NSString stringWithFormat:@"%d",k];
NSDictionary *dicr = jsonObject[@"journalList"][strfd];
k=k+1;
// NSLog(@"dicr: %@",dicr);
NSLog(@"cust_code - journal_amount : %@ - %@",
[NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"cust_code"]],
[NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"journal_amount"]]);
}

}

}else{
NSLog(@"Error - %@",jsonError);
}

}
}];

由此,我能够成功获取JSON。但这总是给我这个错误: Error Domain=NSCocoaErrorDomain Code=3840 "No string key for value in an object around character 6." UserInfo={NSDebugDescription=No string key for value in an object around character 6.} 如何从 journalList获取所有值?我是iOS的新手,这就是为什么不确定我丢失了什么。

最佳答案

id myJSON;
@try {
myJSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}
@catch (NSException *exception) {
}
@finally {
}
jsonArray = (NSMutableArray *)myJSON;

NSString *nsstring = [jsonArray description];
NSLog(@"IN STRING -> %@",nsstring);

NSData *data = [nsstring dataUsingEncoding:NSUTF8StringEncoding];
NSError *jsonError;
NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];

我会说:

我不会对 NSJSONSerialization进行@ try / @ catch,因为真正的问题在 error参数上(在大多数情况下,它们不会抛出 NSException)。只需检查 if (data)是相当有效的。

然后,假设它起作用了,您就有了 myJSON
实际上, myJSONNSDictionary,而不是 NSArray,因此强制类型转换无用且没有意义。

下期:
您正在使用 -description(好的,如果要调试),但是您不能使用它来重新构造JSON。这不是有效的JSON,它是编译器“打印”对象,添加“;”等的方式。
如果您打印 [nsstring dataUsingEncoding:NSUTF8StringEncoding]data,您会发现它们不相同。
为了更易读: NSString *dataJSONStr = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding];,显然与 nsstring的结构不同。

然后,您要重做JSON序列化吗?为什么呢

所以:
NSError *errorJSON = nil;
NSDictionary *myJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&errorJSON];
if (errorJSON)
{
NSLog(@"Oops error JSON: %@", errorJSON);
}
NSDictionary *data = myJSON[@"data"];
NSArray *journalList = data[@"journalList"]
for (NSDictionary *aJournalDict in journalList)
{
NSUInteger amount = [aJournalDict[@"journal_amount"] integerValue];
NSString *code = aJournalDict[@"journal_code"];
}

关于ios - 来自NSMutableArray的 objective-c JSON解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45479610/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com