JSON для Objective-C испортил мой массив - PullRequest
0 голосов
/ 02 августа 2011

Это странная ошибка, и я не уверен, правильно ли я использую JSON.Когда я получаю ответ от сервера с правильным массивом, 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 ]

2 голосов
/ 02 августа 2011

Я не вижу, что не так. Вы хотели allValues, вы получили все значения. Помимо порядка, "с сервера" и "после JSON" эквивалентны.

Порядка нет, потому что NSDictionary (который, я считаю, ваш JSONValue возвращает) не гарантирует порядок И ключей там нет, потому что вы не запрашивали ключи, вы запрашивали значения.

Если вам нужны ключи, есть метод allKeys. А если вам нужно конкретное значение, есть objectForKey: или valueForKey:. Вы также можете использовать различные счетчики. Например, я считаю, что это должно работать:

NSDictionary *dict = [content JSONValue];
for (id key in dict) {
    NSLog(@"key: %@   value:%@", key, [dict objectForKey:key]);
}
0 голосов
/ 02 августа 2011

JSON ничего не проверяет - на самом деле большинство ваших значений равно 0. Вы не работаете с простыми массивами, вы работаете с парами ключ-значение. В Objective-C они становятся NSDictionary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...