Objective-C / iOS: преобразование массива объектов в строку JSON - PullRequest
5 голосов
/ 04 февраля 2012

В настоящее время я экспериментирую с использованием JSON для передачи данных через Интернет. Я успешно получил строку JSON и преобразовал ее в NSDictionary, но не смог понять, как преобразовать массив или словарь объектов в представление JSON.

Я прочитал ряд постов и статей, в которых объясняется, как создать NSDictionary пар ключ / значение, а затем преобразовать в JSON, что прекрасно работает для простого массива, но как этого добиться, если у вас есть массив или словарь объектов.

Так, например, у меня есть массив объектов "contact", который я бы затем хотел преобразовать в строку JSON следующим образом:

"contacts":{
    "contact":[
    {
        "id":"1"
        "first_name":"john",
        "last_name":"citizen",
        "phone":"9999 9999"
    }
    {
        "id":"1"
        "first_name":"jane",
        "last_name":"doe",
        "phone":"8888 8888"
    }
    ]
 }

У меня есть NSMutableDictionary, который заполняет список контактных объектов:

    NSMutableDictionary* contactsToBeSynced = [[NSMutableDictionary alloc] init];
    //Populate dictionary with contact objects.
    contactsToBeSynced = self.getNonSynchronisedData;

Затем я пытаюсь преобразовать словарь объектов с помощью метода NSJSONSerialization, но он завершается ошибкой.

    NSError* error;
    NSString* jsonString;
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:contactsToBeSynced options:NSJSONWritingPrettyPrinted error:&error];
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

Кто-нибудь смог успешно сделать это? Был бы очень признателен за помощь или точку в правильном направлении. Приветствия.

Ответы [ 4 ]

5 голосов
/ 04 февраля 2012

О вашей структуре - ваш contactsToBeSynced должен иметь класс NSDictionary, а contact должен быть NSArray, содержащий NSDictionary объекты для разных контактов Кстати, вы пробовали JSONKit ? Это сериализация работает лучше, чем стандартная NSJSONSerialization.

1 голос
/ 05 февраля 2012

Я разобрался ...

Я создал NSArray контактных объектов и использую инфраструктуру SBJson с SBJsonWriter:

SBJsonWriter *writer = [[SBJsonWriter alloc] init];
NSString *jsonString = [writer stringWithObject:arr];

Я получил строку JSON со списком контактов.

0 голосов
/ 01 августа 2014

Как правило, вы пишете метод toDictionary для каждого класса, который берет интересующие вас поля и вставляет их в словарь.Для числовых полей вы конвертируете в NSNumber перед вставкой.Если какое-либо поле является объектом, вы вызываете метод toDictionary для этого объекта и вставляете результат в свой словарь.Если у вас есть массив объектов, вам нужно написать цикл, но в этом нет ничего экзотического.

Чтобы изменить операцию, вы пишете метод initWithDictionary для каждого класса.

0 голосов
/ 12 сентября 2012

Проверьте мой ответ на вопрос '' SBJsonWriter Nested NSDictionary ''. это иллюстрирует, как правильно использовать SBJsonWriter.

Включает Проверка ошибок SBJsonWriter! и некоторые советы о поведении SBJsonWriter с NSDate, float и т. Д.

Выдержка:

NSDictionary* aNestedObject = [NSDictionary dictionaryWithObjectsAndKeys:
                                      @"nestedStringValue", @"aStringInNestedObject",
                                      [NSNumber numberWithInt:1], @"aNumberInNestedObject",
                                 nil];

NSArray * aJSonArray = [[NSArray alloc] initWithObjects: @"arrayItem1", @"arrayItem2", @"arrayItem3", nil];

NSDictionary * jsonTestDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                     @"stringValue", @"aString",
                                     [NSNumber numberWithInt:1], @"aNumber",
                                     [NSNumber numberWithFloat:1.2345f], @"aFloat",
                                     [[NSDate date] description], @"aDate",
                                     aNestedObject, @"nestedObject",
                                     aJSonArray, @"aJSonArray",
                                     nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...