Перетворення 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

Відповіді:


258

Я вважаю, що ви неправильно тлумачите формат 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"]);

Результатом став би ще один словник NSD.

{
    Content = 268;
    type = text;
}

Сподіваюся, це допомагає отримати чітке розуміння.


1
Насправді це не відповідь на запитання, оскільки ви кажете людині переформатувати свій рядок. У деяких випадках (наприклад, квитанції IAP у форматі iOS6) вам надається рядок у цьому форматі.
Кріс Принс

1
Ви завжди можете публікувати відповіді навіть на запитання, на які прийняті відповіді. Тож, будь ласка, поспішіть та опублікуйте свою версію відповіді та зверніться до ОП, щоб розглянути можливість прийняття відповіді. :)
Янак Нірмал

1
BTW OP розмістив JSON? Ви впевнені в цьому? Будь ласка, перевірте вимоги OP та чи можливо це досягти в рамках цього формату? Якщо так, дайте відповідь на запитання, і я проголосую і створу нову нагороду та присуджую вам.
Janak Nirmal,

14

Я думаю, ви отримуєте масив із відповіді, тому вам доведеться призначити відповідь масиву.

NSError * err = nil;
NSArray * array = [NSJSONSerialization JSONObjectWithData: [string dataUsingEncoding: NSUTF8StringEncoding] параметри: Помилка NSJSONReadingMutableContainers: & err];
NSD Dictionary * dictionary = [масив objectAtIndex: 0]; 
NSString * test = [об'єкт словникаForKey: @ "ID"];
NSLog (@ "Тест% @", тест);

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

ПОМИЛКА - помилка Домен = NSCocoaErrorDomain Код = 3840 "Операцію не вдалося виконати. (Помилка какао 3840.)" (Текст JSON не починається з масиву або об'єкта та не дозволяє встановлювати фрагменти.) UserInfo = 0x1f5b3660 {NSDebugDescription = Текст JSON не починався з масиву чи об'єкта та параметр дозволити не встановлені фрагменти.}
GuybrushThreepwood

щось невірно сформовано у ваших даних JSON
Вудсток

2

Свіфт 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];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.