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(=),逗号 (,) 更改为分号 (;),因此“pack”为空。我无法反序列化 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> *DataNSArray<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
}

对不起我的英语并感谢您的帮助。

4

3 回答 3

1

我已经使用 JSONModel 框架来了解发生了什么。

请注意,请在您的项目中使用驼峰式表示法。

模型类(在这种情况下只有头文件很重要):

语言字符串.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

语言包.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 结构 - 没有它我无法给您明确的答案。

至少,我可以为 JSON 推荐一个NSJSONSerialization

您可以从以下内容开始:

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

请注意,您可以使用 '(NSArray*)' 而不是 '(NSDictionary*)' - 这取决于您的数据结构。

好的,所以我会给你一些想法如何使用 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 回答
0

JSON 提要中的“数据”键是一个数组。因此,您的“数据”属性也需要是一个数组而不是 NSObject。

但我想你已经知道了,因为你注意到如果你这样做它会起作用

于 2014-01-23T16:01:19.130 回答