2014-01-23 3 views
1

Я использую jsonmodel для сериализации операций. Я отправляю сообщение на сервер и получаю данные json. Я десериализую данные на этот объект.jsonmodel deserialize object

#import <Foundation/Foundation.h> 
#import "JSONModel.h" 
@interface ResultObject : JSONModel 

@property (strong, nonatomic) NSObject<Optional> *Data; 
@property (strong, nonatomic) NSString *ResultCode; 
@property (strong, nonatomic) NSString *ResultMessage; 
@property (strong, nonatomic) NSObject<Optional> *Exception; 
@end 

Я могу получить простые данные. Как логическое значение или строка. Но когда я пытаюсь передать данные в свой пользовательский объект. данные были повреждены. Я использую этот код для трансляции.

ResultObject *resultObject = [[ResultObject alloc]initWithString:result error:&error]; 
NSString *returnAnswer = [NSString stringWithFormat:@"%@",resultObject.Data]; 
LanguagePack *pack =[[LanguagePack alloc]initWithString:returnAnswer usingEncoding:NSASCIIStringEncoding error:&error]; 

двоеточие (:) изменение к равно (=) и запятых (,) изменение запятой (;) в returnAnswer так "пакет" является недействительным. Я не могу десериализовать данные json.

это мой LanguagePack

@interface LanguagePack : JSONModel 
@property(strong,nonatomic) NSArray<LanguageString> *Data; 
@end 

и это мой LanguageString

@protocol LanguageString; 

@interface LanguageString : JSONModel 

    @property (strong, nonatomic) NSString *DataKey; 
    @property (strong, nonatomic) NSString *DataValue; 
    @property (strong, nonatomic) NSString *DataDescription; 
    @property (strong, nonatomic) NSString *DataLanguage; 
    @end 

Мой вопрос заключается в том, что как я могу десериализации данные JSon внутри NSObject (Data) для моих пользовательских объектов?

Edit Примечание: когда я смотрю на ResultObject.Data имеет 14 объектов (как должно быть), но каждый объект имеет ошибку:

ожидается «]» Ошибка: 1 ошибки разбора выражения

, как это ,

, и если я меняю NSObject<Optional> *Data на NSArray<LanguageString> *Data, он работает правильно. Но мне нужен общий тип, например NSObject.

Мои Json

{ 
"Data":[ 
{ 
"DataKey":"AppTemplate.CancelButton.Text", 
"DataValue":"Iptal", 
"DataDescription":"", 
"DataLanguage":"TR" 
}, 
{ 
"DataKey":"Exception.Code.07", 
"DataValue":"SMS dogrulama kodu hatali ya da zaman asimina ugramis.", 
"DataDescription":"SmsVerificationCodeNotVerifiedException", 
"DataLanguage":"TR" 
}, 
{ 
"DataKey":"Exception.Code.11", 
"DataValue":"Geçersiz dil bilgisi.", 
"DataDescription":"InvalidLanguageException", 
"DataLanguage":"TR" 
} 
], 
"ResultCode":"00", 
"ResultMessage":"Success", 
"Exception":null 
} 

Извините за мой английский и спасибо за помощь.

ответ

1

У меня есть использовать рамки JSONModel, чтобы выяснить, что происходит.

примечание, используйте кейс для верблюда запись в ваш проект.

классы Модель (только заголовок файлы имеют важное значение в данном случае):

LanguageString.h

#import "JSONModel.h" 

@protocol LanguageString; 

@interface LanguageString : JSONModel 

    @property (strong, nonatomic) NSString *DataKey; 
    @property (strong, nonatomic) NSString *DataValue; 
    @property (strong, nonatomic) NSString *DataDescription; 
    @property (strong, nonatomic) NSString *DataLanguage; 

@end 

LanguagePack.h

#import "JSONModel.h" 
#import "LanguageString.h" 

@interface LanguagePack : JSONModel 
    @property(strong,nonatomic) NSArray<LanguageString> *Data; 
@end 

ResultObject

#import <Foundation/Foundation.h> 
#import "JSONModel.h" 
#import "LanguageString.h" 

@interface ResultObject : JSONModel 

    @property (strong, nonatomic) NSArray<LanguageString> *Data; 
    @property (strong, nonatomic) NSString *ResultCode; 
    @property (strong, nonatomic) NSString *ResultMessage; 
    @property (strong, nonatomic) NSObject<Optional> *Exception; 

@end 

, а затем запустить:

NSString *json = @"{\"Data\":[{\"DataKey\":\"AppTemplate.CancelButton.Text\",\"DataValue\":\"Iptal\",\"DataDescription\":\"\",\"DataLanguage\":\"TR\"},{\"DataKey\":\"Exception.Code.7\",\"DataValue\":\"SMS dogrulama kodu hatali ya da zaman asimina ugramis.\",\"DataDescription\":\"SmsVerificationCodeNotVerifiedException\",\"DataLanguage\":\"TR\"},{\"DataKey\":\"Exception.Code.11\",\"DataValue\":\"Geçersiz dil bilgisi.\",\"DataDescription\":\"InvalidLanguageException\",\"DataLanguage\":\"TR\"}],\"ResultCode\":\"00\",\"ResultMessage\":\"Success\",\"Exception\":null}"; 

    ResultObject *ro = [[ResultObject alloc] initWithString:json error:nil]; 
    NSLog(@"ResultCode=%@, ResultMessage=%@", ro.ResultCode, ro.ResultMessage); 
    for (LanguageString *ls in ro.Data) { 
     NSLog(@"\n-----\nDataKey=%@\nDataValue=%@\nDataDescription=%@\nDataLanguage=%@\n-----", ls.DataKey, ls.DataValue, ls.DataDescription, ls.DataLanguage); 
    } 

РЕЗУЛЬТАТ:

2014-01-24 14:46:31.050 Test[1420:70b] ResultCode=00, ResultMessage=Success 
2014-01-24 14:46:31.052 Test[1420:70b] 
----- 
DataKey=AppTemplate.CancelButton.Text 
DataValue=Iptal 
DataDescription= 
DataLanguage=TR 
----- 
2014-01-24 14:46:31.052 Test[1420:70b] 
----- 
DataKey=Exception.Code.7 
DataValue=SMS dogrulama kodu hatali ya da zaman asimina ugramis. 
DataDescription=SmsVerificationCodeNotVerifiedException 
DataLanguage=TR 
----- 
2014-01-24 14:46:31.053 Test[1420:70b] 
----- 
DataKey=Exception.Code.11 
DataValue=Geçersiz dil bilgisi. 
DataDescription=InvalidLanguageException 
DataLanguage=TR 
----- 

Я надеюсь, что это то, что вы ожидаете, ResultObject необходимо определить тип массива, вот единственное различие:

@property (strong, nonatomic) NSArray<LanguageString> *Data; 
0

Предоставьте структуру JSON ваших пользовательских объектов - я не могу дать вам четкий ответ без него.

По крайней мере, я могу рекомендовать для JSON NSJSONSerialization

Вы можете просто начать что-то вроде:

NSData *responseData; // insert your data here 
NSDictionary *response = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil]; 
NSLog(@"response :%@", response); 

Примечание, вместо '(NSDictionary *)' вы можете использовать «(NSArray *) '- это зависит от вашей структуры данных.

ОК, так что я дам вам некоторое представление о том, как разобрать его с помощью NSJOSONSerlization:

NSData* responseData = [dataStr dataUsingEncoding:NSUTF8StringEncoding]; 
NSDictionary *response = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil]; 
NSLog(@"response :%@", response); 
// Parse 
NSString *resultCode = response[@"ResultCode"]; 
NSString *resultMessage = response[@"ResultMessage"]; 
NSArray *dataArr = response[@"Data"]; 
for (NSDictionary *item : dataArr) { 
    LanguageString *ln = [LanguageString new]; 
    ln.dataKey = item[@"DataKey"]; 
    ln.dataValue = item[@"DataValue"]; 
    ln.dataDescription = item[@"DataDescription"]; 
    ln.dataLanguage = item[@"DataLanguage"]; 
    /* TODO: store 'ln' object in desired model */ 
} 

Конечно, предполагая, что dataStr подобен:

NSString *dataStr = @"{\"Data\":[{\"DataKey\":\"AppTemplate.CancelButton.Text\",\"DataValue\":\"Iptal\",\"DataDescription\":\"\",\"DataLanguage\":\"TR\"},{\"DataKey\":\"Exception.Code.7\",\"DataValue\":\"SMS dogrulama kodu hatali ya da zaman asimina ugramis.\",\"DataDescription\":\"SmsVerificationCodeNotVerifiedException\",\"DataLanguage\":\"TR\"},{\"DataKey\":\"Exception.Code.11\",\"DataValue\":\"Geçersiz dil bilgisi.\",\"DataDescription\":\"InvalidLanguageException\",\"DataLanguage\":\"TR\"}],\"ResultCode\":\"00\",\"ResultMessage\":\"Success\",\"Exception\":null}"; 

Пожалуйста, обратите внимание, что это только намек. Также рассмотрите использование такой структуры как ResKit

+0

Я добавляю json на вопрос – sagnymine

+0

это не т работы. та же проблема. «dataStr» является правильным. но «данные» в «ответе» повреждены. – sagnymine

+1

http://imgur.com/4eyEJmO – sagnymine

0

Ключ «Данные» в вашем канале JSON представляет собой массив. Поэтому ваше свойство Data также должно быть массивом вместо NSObject.

Но я думаю, вы уже знали, что так как вы отметили, что это работает, если вы делаете что

+0

Да, моя проблема заключается в получении данных как nsobject. после того, как он подбрасывает то, что мне нужно. (массив или пользовательский объект или строка или bool, это может быть каждый тип) – sagnymine

+0

JSONModel проверяет структуру вашего JSON перед созданием экземпляра модели, у вас не может быть ЛЮБОГО типа для заданного ключа –