2014-01-23 150 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的结构,对于给定的键不能有任何类型 –