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

У меня есть следующие данные, сохраненные как 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 для ключевых значений. Вы должны сохранить свою строку как

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;
}

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

Ответ 2

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

NSError *err = nil;
NSArray *array = [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&err];
NSDictionary *dictionary = [array objectAtIndex:0];
NSString *test = [dictionary objectForKey:@"ID"];
NSLog(@"Test is %@",test);

Ответ 3

Используйте этот код, где 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
}

Ответ 4

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)
    }
}

Ответ 5

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

id responseObject = [NSJSONSerialization JSONObjectWithData: (NSData *) error.userInfo [AFNetworkingOperationFailingURLResponseDataErrorKey]: 0 error: nil];