Преобразование NSString в NSDictionary / JSON

83

У меня есть следующие данные, сохраненные в виде NSString:

 {
    Key = ID;
    Value =         {
        Content = 268;
        Type = Text;
    };
},
    {
    Key = ContractTemplateId;
    Value =         {
        Content = 65;
        Type = Text;
    };
},

Я хочу преобразовать эти данные в файл, NSDictionaryсодержащий пары ключ-значение.

Сначала я пытаюсь преобразовать NSStringв объекты JSON следующим образом:

 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

Однако, когда я пытаюсь:

NSString * test = [json objectForKey:@"ID"];
NSLog(@"TEST IS %@", test);

Я получаю значение как NULL.

Кто-нибудь может подсказать, в чем проблема?

Гайбраш
источник
1
Обратите внимание, что здесь в данной строке json «ID» - это значение, а не ключ.
Сунил Залавадия
NSLog (@ "JSON IS% @", json); ??????
Prasad G

Ответы:

259

Я считаю, что вы неправильно интерпретируете формат JSON для значений ключей. Вы должны сохранить свою строку как

NSString *jsonString = @"{\"ID\":{\"Content\":268,\"type\":\"text\"},\"ContractTemplateID\":{\"Content\":65,\"type\":\"text\"}}";
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

Теперь, если вы выполните следующую инструкцию NSLog

NSLog(@"%@",[json objectForKey:@"ID"]);

Результатом будет еще один NSDictionary.

{
    Content = 268;
    type = text;
}

Надеюсь, это поможет получить четкое понимание.

Джанак Нирмал
источник
1
Не совсем ответ на вопрос, поскольку вы говорите человеку переформатировать свою строку. В некоторых случаях (например, в квитанциях IAP в формате iOS6) вам предоставляется строка в этом формате.
Крис Принс,
1
Вы всегда можете публиковать ответы даже на те вопросы, на которые есть принятые ответы. Поэтому поторопитесь и опубликуйте свою версию ответа и обратитесь к OP, чтобы рассмотреть возможность пересмотра принятого ответа. :)
Джанак Нирмал
1
BTW OP опубликовал JSON? Вы уверены, что? Пожалуйста, проверьте требования OP и возможно ли это в рамках этого формата? Если да, ответьте на вопрос, и я проголосую за, создам новую награду и присужу ее вам.
Джанак Нирмал
14

Я думаю, вы получаете массив из ответа, поэтому вам нужно назначить ответ массиву.

NSError * err = nil;
NSArray * array = [NSJSONSerialization JSONObjectWithData: [строка dataUsingEncoding: NSUTF8StringEncoding] параметры: NSJSONReadingMutableContainers error: & err];
NSDictionary * dictionary = [массив objectAtIndex: 0]; 
NSString * test = [словарь objectForKey: @ "ID"];
NSLog (@ "Тест% @", тест);
MobileDev
источник
6

Используйте этот код, где str - ваша строка JSON:

NSError *err = nil;
NSArray *arr = 
 [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] 
                                 options:NSJSONReadingMutableContainers 
                                   error:&err];
// access the dictionaries
NSMutableDictionary *dict = arr[0];
for (NSMutableDictionary *dictionary in arr) {
  // do something using dictionary
}
Вудсток
источник
[arr count] возвращает ноль.
GuybrushThreepwood
ОШИБКА: Error Domain = NSCocoaErrorDomain Code = 3840 «Операция не может быть завершена. (Ошибка какао 3840.)» (Текст JSON не начинается с массива или объекта, и параметр, разрешающий фрагменты, не установлен.) UserInfo = 0x1f5b3660 {NSDebugDescription = Текст JSON не начинается с массива или объекта, а опция разрешения фрагментов не установлена.}
GuybrushThreepwood
что-то неправильно сформировано в ваших данных json
Вудсток
2

Swift 3:

if let jsonString = styleDictionary as? String {
    let objectData = jsonString.data(using: String.Encoding.utf8)
    do {
        let json = try JSONSerialization.jsonObject(with: objectData!, options: JSONSerialization.ReadingOptions.mutableContainers) 
        print(String(describing: json)) 

    } catch {
        // Handle error
        print(error)
    }
}
Джош О'Коннор
источник
0

Используйте следующий код, чтобы получить объект ответа из AFHTTPSessionManagerблока сбоя; тогда вы можете преобразовать общий тип в требуемый тип данных:

id responseObject = [NSJSONSerialization JSONObjectWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] options:0 error:nil];
krish2me
источник