Вопрос по json, ios – Преобразовать объект-цель iOS в строку JSON

24

У меня есть объективный класс C, как,

<code>@interface message : NSObject {
 NSString *from;
 NSString *date;
 NSString *msg;
}
</code>

У меня есть NSMutableArray экземпляров этого класса сообщений. Я хочу сериализовать все экземпляры в NSMutableArray в файл JSON, используя новые API JSONSerialization в iOS 5 SDK. Как я могу это сделать ?

Создает ли NSDictionary каждого ключа, перебирая каждый экземпляр элементов в NSArray? Может кто-нибудь помочь с кодом, как решить эту проблему? Я не могу получить хорошие результаты в Google, как & quot; JSON & quot; искажает результаты для вызовов на стороне сервера и передачи данных вместо сериализации. Большое спасибо.

РЕДАКТИРОВАТЬ:

<code>NSError *writeError = nil; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
NSLog(@"JSON Output: %@", jsonString);
</code>

Ваш Ответ

4   ответа
37

РЕДАКТИРОВАТЬ: я сделал фиктивное приложение, которое должно быть хорошим примером для вас.

Я создаю класс Message из вашего фрагмента кода;

//Message.h
@interface Message : NSObject {
    NSString *from_;
    NSString *date_;
    NSString *msg_;
}

@property (nonatomic, retain) NSString *from;
@property (nonatomic, retain) NSString *date;
@property (nonatomic, retain) NSString *msg;

-(NSDictionary *)dictionary;

@end

//Message.m
#import "Message.h"

@implementation Message

@synthesize from = from_;
@synthesize date = date_;
@synthesize msg = mesg_;

-(void) dealloc {
    self.from = nil;
    self.date = nil;
    self.msg = nil;
    [super dealloc];
}

-(NSDictionary *)dictionary {
    return [NSDictionary dictionaryWithObjectsAndKeys:self.from,@"from",self.date,    @"date",self.msg, @"msg", nil];
}

Затем я установил NSArray из двух сообщений в AppDelegate. Хитрость заключается в том, что не только объект верхнего уровня (в вашем случае уведомления) должны быть сериализуемыми, но и все элементы, содержащиеся в уведомлениях: Вот почему я создалdictionary метод в классе Message.

//AppDelegate.m
...
Message* message1 = [[Message alloc] init];
Message* message2 = [[Message alloc] init];

message1.from = @"a";
message1.date = @"b";
message1.msg = @"c";

message2.from = @"d";
message2.date = @"e";
message2.msg = @"f";

NSArray* notifications = [NSArray arrayWithObjects:message1.dictionary, message2.dictionary, nil];
[message1 release];
[message2 release];


NSError *writeError = nil; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
NSLog(@"JSON Output: %@", jsonString);

@end

Вывод при запуске приложения выглядит следующим образом:

2012-05-11 11:58:36.018 stack[3146:f803] JSON Output: [ { "msg" : "c", "from" : "a", "date" : "b" }, { "msg" : "f", "from" : "d", "date" : "e" } ]

ОРИГИНАЛЬНЫЙ ОТВЕТ:

Являетсяэтот документацию, которую вы ищете?

OP сначала должен преобразовать свой объект в словарь, но это довольно просто (статический метод поможет)
почему бы не опубликовать больше кода сейчас, чтобы мы могли видеть, что вы делаете?
Если все ваши классные ivars являются NSString, то это должно просто волшебным образом работать ... caveat: Я не пробовал это.
Дамо: эта страница не объясняет преобразование массива пользовательских классов в JSON. Вот что я изо всех сил пытаюсь найти. Sankar
@ Damo Я получаю ошибку во время выполнения: Завершение приложения из-за необработанного исключения »NSInvalidArgumentException», причина: »- [message dictionaryRepresentation]: нераспознанный селектор, отправленный экземпляру Sankar
2

Примечание: это будет работать только с сериализуемыми объектами. Этот ответ был предоставлен выше при редактировании самого вопроса, но я всегда ищу ответы в разделе «ответы». раздел сам ;-)

- (NSString*) convertObjectToJson:(NSObject*) object
{
    NSError *writeError = nil;

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:NSJSONWritingPrettyPrinted error:&writeError];
    NSString *result = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    return result;
}
Привет. Как конвертировать массив из NSObject. Спасибо вам :)
эй @kemdo - не уверен - и я больше не делаю ios dev, так что не могу сказать ... Удачи!
8

Теперь вы можете легко решить эту проблему, используяJSONModel, JSONModel - это библиотека, которая обобщенно сериализует / десериализует ваш объект на основе Class. Вы даже можете использовать не-nsobject на основе свойства, какint, short а такжеfloat, Он также может обслуживать вложенный комплекс JSON. Он обрабатывает проверку ошибок для вас.

Deserialize example, в заголовочном файле:

#import "JSONModel.h"

@interface Message : JSONModel 
@property (nonatomic, strong) NSString* from;
@property (nonatomic, strong) NSString* date;
@property (nonatomic, strong) NSString* message;
@end

в файле реализации:

#import "JSONModelLib.h"
#import "yourPersonClass.h"

NSString *responseJSON = /*from somewhere*/;
Message *message = [[Message alloc] initWithString:responseJSON error:&err];
if (!err)
{
   NSLog(@"%@  %@  %@", message.from, message.date, message.message):
}

Serialize Example, В файле реализации:

#import "JSONModelLib.h"
#import "yourPersonClass.h"

Message *message = [[Message alloc] init];
message.from = @"JSON beast";
message.date = @"2012";
message.message = @"This is the best method available so far";

NSLog(@"%@", [person toJSONString]);
Спасибо! Эта библиотека очень полезна.
0

Вот библиотека, которую я использовал в своих проектахBWJSONMatcher, что может помочь вам легко сопоставить строку json с вашей моделью данных, используя не более одной строки кода.

...
NSString *jsonString = @"{your-json-string}";
YourValueObject *dataModel = [YourValueObject fromJSONString:jsonString];

NSDictionary *jsonObject = @{your-json-object};
YourValueObject *dataModel = [YourValueObject fromJSONObject:jsonObject];
...
YourValueObject *dataModel = instance-of-your-value-object;
NSString *jsonString = [dataModel toJSONString];
NSDictionary *jsonObject = [dataModel toJSONObject];
...

Похожие вопросы