Напишите ответ JSON в файл .plist

Разочарование на вершине!!!

Я получаю сообщение JSON Response из службы, и я хочу сохранить его в файле .plist для Future Reference. Я не могу сохранить мой ответ JSON в файл .plist. Я думаю, что это связано с некоторыми значениями null в Response.

Примечание. Я подтвердил, что ответ находится в формате JSON, используя jsonparser.


Мой код:

NSError *error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSDictionary *dictResult = [(NSDictionary*)json objectForKey:@"myKey"];
NSLog(@"Result Dictionary :: %@",dictResult);

NSURL *cacheDir = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *path = [cacheDir URLByAppendingPathComponent:@"FinalResult.plist"];
NSLog(@"Path :: %@",path);

BOOL success = [dictResult writeToURL:path atomically:YES];
NSLog(@"success? %d", success);

Примечание: Я получил все значения NSLog (означает Словарь ответов и Путь к файлу, но 0 для успеха).


Проблема: В ответе почти 70-80 пар ключ-значение, и я не хочу удалить/заменить все значения null. Потому что я хочу...

  • Получить ответ с сервера.
  • Заполните все UITextFields с помощью ответа.
  • ОТПРАВЛЯЙТЕ тот же ответ на сервер с некоторыми Измененными значениями из UITextFields.

Итак, я просто хочу изменить значения Edited UITextField в Object и передать POST на сервер.

Каков оптимальный способ исправить это?

Ответ 1

Держу пари, что ваш JSON содержит хотя бы одно значение null.

Когда у вас есть JSON, который содержит null, и вы конвертируете его с помощью NSJSONSerialization, null заменяется экземпляром NSNull. Если ваш словарь содержит NSNull, то writeToURL:atomically: завершится с ошибкой.

Это связано с тем, что удобные методы чтения и записи словарей (и массивов) работают только в том случае, если данные в коллекции ограничены списками свойств свойств. Это:

  • NSString
  • NSNumber
  • NSData
  • NSDate
  • NSArray
  • NSDictionary. А для словарей ключи должны быть NSString s.

Вы также можете использовать изменяемые подклассы (например, NSMutableString).

Если у вас есть что-то не в этом списке, вы не можете использовать writeToURL:atomically или любой из подобных методов удобства.

Проблема заключается в том, что некоторые допустимые JSON не могут быть преобразованы в списки свойств. Кроме того, некоторые допустимые списки свойств не могут быть преобразованы в JSON (поскольку NSDate не будет автоматически преобразовываться в действительный JSON).

Если бы это был я, я бы просто записал данные в файл JSON. Оставьте его в исходном формате. Вы можете легко конвертировать в/из JSON, поэтому оставьте его таким образом.

Ответ 2

Если ваш словарь содержит NSNull, то writeToURL:atomically: сбой.

Для словарей клавишами должны быть NSStrings.

Проблема в том, что некоторая допустимая JSON не может быть преобразована в списки свойств. Кроме того, некоторые допустимые списки свойств не могут быть преобразованы в JSON.

Не забудьте, если вы должны использовать список свойств, вам нужно будет отсканировать весь словарь и преобразовать нули в то, что может быть сохранено в файле списка свойств.

Только решение состоит в том, что вам нужно проверить все значения NULL и заменить его на @".

Счастливое кодирование...

Ответ 3

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryPath = [paths objectAtIndex:0];
NSString *filename = @"FinalResult.plist";
NSString *pathFilename = [libraryPath stringByAppendingPathComponent:filename];

NSDictionary *dictResult = [json objectForKey:@"myKey"];
[dictResult writeToFile:pathFilename atomically:YES];

Ответ 4

Я создаю свои URL-адреса таким образом:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSString *filename = @"FinalResult.plist";
NSString *pathFilename = [path stringByAppendingPathComponent:filename];

Затем посмотрите, записывает ли это:

BOOL success = [dictResult writeToFile:pathFilename atomically:YES];
NSLog(@"success? %d", success);

Изменить. Забавно, я недавно столкнулся с этой проблемой, а затем забыл все об этом. Некоторые парсеры JSON будут использовать [NSNull null] в качестве заполнителей для значений nil. Я написал это (серьезно, примерно две недели назад, а затем разнесся на нем), чтобы очистить результат анализа...

- (NSDictionary *)compact:(NSDictionary *)aDictionary {

    NSDictionary *answer = [NSMutableDictionary dictionary];

    for (NSString *key in [aDictionary allKeys]) {
        id value = [self.dictionary valueForKey:key];
        if (value && value != [NSNull null]) {
            [answer setValue:value forKey:key];
        }
    }
    return [NSDictionary dictionaryWithDictionary:answer];
}

Это может быть сделано в дополнение к категории NSDictionary, если вы захотите.

Ответ 5

  • Проверьте, возвращает ли возвращаемое значение метода writeToURL:atomically: YES.
  • Если это не так, проверьте, есть ли у вас права на запись на этот URL.
  • Попробуйте использовать другой URL-адрес, чтобы узнать, есть ли его путь или содержимое словаря, вызывающего эту ошибку.

Ответ 6

Попробуйте, это сработает:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"country.plist"];
[jsonData writeToFile:path atomically:YES];