2014-01-23 220 views
1

我正在使用jsonmodel進行序列化操作。我發送帖子到服務器並獲取json數據。我將數據反序列化到這個對象。jsonmodel反序列化對象

#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 

我的問題是,我怎麼能NSObject的(數據)裏面的JSON數據反序列化到我的自定義對象?

編輯注意:當我看到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 feed中的「Data」鍵是一個數組。因此你的「Data」屬性也需要是一個數組而不是NSObject。

但我猜你已經知道了,因爲你注意到,它的作品,如果你做到這一點

+0

是的,我的問題是獲取數據作爲一個nsobject。在它鑄造到我需要的類型之後。 (數組或自定義對象或字符串或布爾型,它可以是每種類型) – sagnymine

+0

JSONModel在創建模型實例之前驗證JSON的結構,對於給定的鍵不能有任何類型 –