2014-01-23 5 views
1

작업을 직렬화하기 위해 jsonmodel을 사용하고 있습니다. 나는 서버에 포스트를 보내고 json 데이터를 얻는다. 이 객체에 데이터를 deserialize합니다.jsonmodel deserialize 객체

#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 

이며,이

@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 

내 문제는 내 LanguageString입니다 나는 내 사용자 정의 개체에 NSObject의 (데이터) 내부의 JSON 데이터를 역 직렬화 할 수있는 방법?

편집 주 : 내가 ResultObject.Data 볼 때 14 개체가 (해야으로)하지만 모든 객체에 오류가 있습니다

기대 ']'오류 :이 같은 1 오류 분석 발현

을 .

으로 변경하고 NSObject<Optional> *Data에서 NSArray<LanguageString> *Data으로 변경하면 제대로 작동합니다. 하지만 NSObject 같은 제네릭 형식이 필요합니다. 도움 내 영어 감사에 대한

{ 
"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 
} 

죄송합니다

내 JSON.

답변

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 구조를 제공 할 수는 없습니다.

적어도, 나는 JSON을 위해 추천 할 수 있습니다 당신은 단지 같은 것을 시작할 수 있습니다 NSJSONSerialization

A : ('대신에'(NSDictionary와 *) '의 사용자가 사용할 수 있습니다,

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

참고있는 NSArray를 *) '- 귀하의 데이터 구조에 따라 다릅니다.

OK, 그래서 당신에게 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 피드의 "데이터"키는 배열입니다. 따라서 "데이터"속성도 NSObject 대신 배열이어야합니다.

는하지만 난 당신이 당신이

+0

예 문제가 데이터를 nsobject로 가져옵니다. 그걸 내가 원하는 걸 캐스팅 한 후. (배열 또는 사용자 정의 객체 또는 문자열 또는 부울, 모든 유형이 될 수 있음) – sagnymine

+0

JSONModel은 모델 인스턴스를 만들기 전에 JSON의 구조를 검증합니다. 주어진 키에 대해 어떤 유형도 가질 수 없습니다 –