2013-11-17 2 views
1

Я пытаюсь создать строку из объекта с помощью JSON сериализациюJson Сериализация массива IOS

Input я есть

NSDictionary *sampledict = @{@"TextVal": @"10233"}; 
NSArray *arr = [NSArray arrayWithObject:sampledict]; 

Выход требуется

[{\"testval\":\"10233\"}] 

Что я пытался

NSDictionary *sampledict = @{@"TextVal": @"10233"}; 
    NSArray *arr = [NSArray arrayWithObject:sampledict]; 
    NSData *innerJson = [NSJSONSerialization dataWithJSONObject:arr options:0 error:NULL]; 
    NSString *innerJsonString = [[NSString alloc] initWithData:innerJson encoding:NSUTF8StringEncoding]; 


    NSLog(@"%@",innerJsonString); 

    // NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    // [dict setObject:innerJsonString forKey:@"sampleId"]; 

    NSData *json = [NSJSONSerialization dataWithJSONObject:innerJsonString options:0 error:NULL]; 
    NSString *jsonString = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@", jsonString); 

и врезался в

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'

Катастрофа происходит потому, что он не имеет верхнего уровня Dict, Помещенный в словаре это solved.But как получить это от JSON этого объекта?

+0

Ввод и вывод задается в вопросе. Пожалуйста, см. Qn –

+0

. Ой, извините. .. .. исправит. .. Посмотрите qn nw –

+1

Во-первых, вы *** УВЕРЕННО *** вы действительно хотите, чтобы JSON в этом формате? Это «внутренний JSON» формат, который иногда используется, но также можно путать (из-за различных странностей отладочной печати), полагая, что символы '\\' должны быть там, когда они этого не делают. –

ответ

3

Что вы делаете неправильно пытается генерировать JSON строку из объекта, который в свою очередь, является строкой:

[dict setObject:innerJsonString forKey:@"sampleId"]; 
NSData *json = [NSJSONSerialization dataWithJSONObject:innerJsonString options:0 error:NULL]; //innerJsonString is a string that can't be serialized as JSON 

Изменить это:

[dict setObject:arr forKey:@"sampleId"]; 
NSData *json = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL]; 

и он должен работать.

Редактировать Для вашего конкретного требования вывода, вы можете использовать:

NSDictionary *sampledict = @{@"TextVal": @"10233"}; 
NSArray *arr = [NSArray arrayWithObject:sampledict]; 
NSData *innerJson = [NSJSONSerialization dataWithJSONObject:arr options:0 error:NULL]; 
NSString *innerJsonString = [[NSString alloc] initWithData:innerJson encoding:NSUTF8StringEncoding]; 

NSLog(@"%@",innerJsonString); 

Но я думаю, вы уже получаете необходимую JSON из первой части вашего кода, и вы решили его самостоятельно:)

+0

Pls видит «требуемый выход». Я знаю, что ошибка означает и как ее можно разрешить. Мой вопрос заключается в том, как создать выход tht –

+0

Ну, чтобы быть конкретным '[\" testval \ ": \" 10233 \ "] 'не является допустимым JSON. [] в JSON, представляет массив, который по существу индексируется некоторым числом, а не каким-то ключевым, например, «фестивалем». Поэтому, если вы действительно пытаетесь получить действительный JSON, структура будет выглядеть примерно так: {\ "testval \": \ "10233 \"} ', которая представляет объект JSON. И первая часть вашего кода возвращает что-то подобное в 'innerJsonString.' –

+0

Однако, если вы действительно отчаянно пытаетесь получить недействительный JSON в качестве вывода, следуйте моему редактированию. –

2

Как указано в сообщении об ошибке, тип верхнего уровня (NSString) не является допустимым типом JSON верхнего уровня. Только словари и массивы являются действительными объектами верхнего уровня в JSON. Ваше приложение сбой на линии, которую вы пытаетесь преобразовать строку в верхний объект уровня JSON:

NSData *json = [NSJSONSerialization dataWithJSONObject:innerJsonString options:0 error:NULL]; 

Замена innerJsonString с dict должны решить эту проблему.

+0

Pls видит «требуемый выход». Я знаю, что ошибка означает и как ее можно решить.Мой вопрос заключается в том, как создать выход tht –

+0

Я только понял, что ваш вывод недействителен JSON. Нет ассоциативных массивов (например, в php). Либо вы получите '{" testval ":" 10233 "}' или '[" testval "," 10233 "]'. – mAu

+0

Это было atypo в qn pls chk it nw –

Смежные вопросы