1

操作のシリアル化に jsonmodel を使用しています。サーバーに投稿を送信し、json データを取得します。データをこのオブジェクトに逆シリアル化します。

#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 では、コロン (:) が equals(=) に変更され、comas(,) がセミコロン (;) に変更されるため、「pack」は null になります。json データをデシリアライズできません。

これは私の言語パックです

@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(Data) 内の 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
}

私の英語で申し訳ありませんが、助けてくれてありがとう。

4

3 に答える 3

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

結果オブジェクト

#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;
于 2014-01-24T14:02:30.237 に答える
0

JSON フィードの「データ」キーは配列です。したがって、「Data」プロパティも NSObject ではなく配列である必要があります。

しかし、あなたはそれをすればうまくいくと指摘したので、あなたはすでにそれを知っていたと思います

于 2014-01-23T16:01:19.130 に答える
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などのフレームワークの使用も検討してください

于 2014-01-23T14:08:18.100 に答える