2011-08-01 21 views
0

这是一个奇怪的错误,我不确定我是否正确使用JSON。当我使用适当的数组从服务器获得响应时,JSON咀嚼它,将大部分值都变为零,我认为它也可能已被键忘记了。Objective-C的JSON弄乱了我的阵列

2011-08-01 16:08:15.981 My Alerts[2746:b303] From Server: {"cycleStart":"May 1, 2011","cycleEnds":"May 29, 2011","avg_usage":0,"estimate":0,"totalBudget":0,"Usage":0,"Cost":0} 
2011-08-01 16:08:15.982 My Alerts[2746:b303] After JSON: (
    0, 
    0, 
    0, 
    0, 
    "May 29, 2011", 
    "May 1, 2011", 
    0 
) 

这是我的代码,显示JSON的使用情况。

NSString *post = [NSString stringWithFormat:@"username=%@&acct=%@", username, account]; 
NSLog(@"POST: %@", post); 
NSData *postData = [NSData dataWithBytes: [post UTF8String] length: [post length]]; 

// Submit login data 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString: @"http://***.****.***/file1.php"]]; 
[request setHTTPMethod: @"POST"]; 
[request setValue: @"application/x-www-form-urlencoded" forHTTPHeaderField: @"Content-Type"]; 
[request setHTTPBody: postData]; 

// Retreive server response 
NSURLResponse *response; 
NSError *err; 
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
if (returnData == nil) { 
    NSLog(@"ERROR: %@", err); 
} 

NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; 
NSLog(@"From Server: %@", content); // <---JSON string returned perfectly from server 

if (content != @"FAIL") 
{ 
    NSArray *viewDetail = [[NSArray alloc] init]; 
    viewDetail = [[[content JSONValue] allValues] mutableCopy]; // <--JSON appears to be chewing it up 
    NSLog(@"After JSON: %@", viewDetail); // <--Array is now messed up here. 

    // Do stuff with viewDetail array 

    [viewDetail release]; 
} 

回答

2

我看不出有什么问题。你想要allValues,你得到了所有的价值。除了排序之外,“从服务器”和“在JSON之后”是相同的。

订单不存在,因为NSDictionary(您的JSONValue返回,我相信)不保证订单。而钥匙不在那里,因为你没有要求钥匙,你要求的价值。

如果你想要钥匙,有allKeys方法。如果你想要一个特定的值,那么有objectForKey:valueForKey:。您也可以使用各种统计员。举例来说,我认为这应该工作:

NSDictionary *dict = [content JSONValue]; 
for (id key in dict) { 
    NSLog(@"key: %@ value:%@", key, [dict objectForKey:key]); 
} 
+0

好的,我看到我看错了。但有没有办法让数组保持其密钥,以便在需要该值时可以通过键来引用它? – Tanoro

+0

您没有阵列。你有'NSDictionary'。数组的键总是从0到大小的整数-1。编辑:实际上,你有一个数组,一旦你用'allValues'切割你的'NSDictionary'。这就像说:“我知道我买了这个肝,但我想要一个兔子,你能把它变成一个吗?” – Amadan

+0

非常机智。 ^^;这让我再次感动。谢谢。 – Tanoro

0

JSON没有咀嚼任何东西 - 大部分的价值观,其实,0你不是用普通数组时,你与重要工作值对。在Objective-C中,这些成为NSDictionary