龚海伟
ghwghw4/JsonParserGitHub仓库
GICJsonParser
示例
为了运行示例项目,首先克隆该仓库,然后从Example目录运行pod install
。
pod 'GICJsonParser'
安装
通过CocoaPods可以使用JsonParser。要安装它,只需将以下行添加到您的Podfile中。
介绍
GICJsonParser
是一个专门用于在Objective-C、Swift中将JSON数据自动转换为对象实例的类库。它支持嵌套对象的解析、数组的解析、自定义属性名称到JSON key的映射,还支持将实例对象序列化为JSON数据。一行代码就能完成。
{
"testInt8": -23,
"testInt16": -1234,
"testInt32": -1234,
"testInt": -1234,
"testUInt8": 23,
"testUInt16": 1234,
"testUInt32": 1234,
"testUInt": 1234,
"testDouble": 3.1415926,
"testFloat": 3.1415926,
"testBool": true,
"testNumber": 6789,
"testString": "hello",
"testStringToInt": "123",
"testStringToBool": "1",
"testNumberToString": 3.1415926,
"testCustomObject": {
"id": 12,
"name": "海伟"
},
"testDict": {
"a": 1,
"b": "b"
},
"testArrayObject": [{
"id": 1,
"name": "海伟1"
}, {
"id": 2,
"name": "海伟2"
}],
"testArrayString": ["a", "b", "c"],
"testArrayNumber": [1, -2, 3.1315],
"testCustomPropertyNameMap": "CustomPropertyName"
}
- 示例
#import <JsonParser/GICJsonParserDelegate.h>
@interface TestObject : NSObject<GICJsonParserDelegate>
@property (nonatomic,assign)int8_t testInt8;
@property (nonatomic,assign)int16_t testInt16;
@property (nonatomic,assign)int32_t testInt32;
@property (nonatomic,assign)NSInteger testInt;
@property (nonatomic,assign)uint8_t testUInt8;
@property (nonatomic,assign)uint16_t testUInt16;
@property (nonatomic,assign)uint32_t testUInt32;
@property (nonatomic,assign)uint testUInt;
@property (nonatomic,assign)double testDouble;
@property (nonatomic,assign)float testFloat;
@property (nonatomic,assign)BOOL testBool;
@property (nonatomic,strong)NSNumber *testNumber;
@property (nonatomic,copy)NSString *testString;
@property (nonatomic,assign)NSInteger testStringToInt;
@property (nonatomic,assign)BOOL testStringToBool;
@property (nonatomic,copy)NSString *testNumberToString;
@property (nonatomic,strong)TestObject2 *testCustomObject;
@property (nonatomic,strong)NSDictionary *testDict;
@property (nonatomic,strong)NSArray<TestObject2 *> *testArrayObject;
@property (nonatomic,strong)NSArray<NSString *> *testArrayString;
@property (nonatomic,strong)NSArray<NSNumber *> *testArrayNumber;
@property (nonatomic,copy)NSString *customPropertyName;
@end
@implementation TestObject
-(Class)jsonParseArrayObjectClass:(NSString *)arrayPropertyName{
if([arrayPropertyName isEqualToString:@"testArrayObject"]){
return [TestObject2 class];
}
return nil;
}
- (NSDictionary<NSString *,NSString *> *)jsonParsePropertNameMap{
return @{@"testCustomPropertyNameMap":@"customPropertyName"};
}
@end
@interface TestObject2 : NSObject
@property (nonatomic,assign)NSInteger id;
@property (nonatomic,copy)NSString *name;
@end
@implementation TestObject2
@end
-
步骤1。首先需要了解JSON的定义,这样才能知道如何定义我们的数据结构。这里直接贴一段JSON示例,其中包含了该类库支持的当前所有数据类型。
完成上述两步后,解析数据变得很简单,只需一行代码即可。解析有两种方式,一种是在项目中引入头文件
<GICJsonParser/GICJsonParser.h>
,直接使用GICJsonParser
进行解析。如下所示:
#import <GICJsonParser/GICJsonParser.h>
TestObject *t = [GICJsonParser parseObjectFromJsonData:jsonData withClass:[TestObject class]];
另一个方式是引入头文件<GICJsonParser/NSObject+GICJsonParser.h>
,利用NSObject的扩展方法进行解析。如下所示:
#import <GICJsonParser/NSObject+GICJsonParser.h>
TestObject *t = [TestObject gic_jsonParseObjectFromJsonData:jsonData];
注意点:
-
关于数组的解析。
由于Objective-C没有泛型概念,因此解析器并不知道数组中具体保存什么类型的数据。因此需要通过
GICJsonParserDelegate
明确告知解析器数组中存储的数据类型。也就是说,需要实现jsonParseArrayObjectClass
这个方法,即使一个类中包含多个数组也没有问题,只需根据属性名称返回正确的Class即可。如果返回nil或者没有实现
jsonParseArrayObjectClass
方法,那么解析器会默认将原始的json array赋值到该属性上。例如,在直接解析字符串数组或数字数组时,如不返回nil或不实现
jsonParseArrayObjectClass
方法,则可以成功解析。 -
自定义属性名称与Json key的映射。
有时候json数据中定义的key与数据结构中定义的属性名称不一致,也可以通过实现
GICJsonParserDelegate
中的jsonParsePropertNameMap
方法明确告知解析器属性名称与json key的映射关系。例如示例中的:testCustomPropertyNameMap与customPropertyName的映射关系。
序列化
使用GICJsonParser
也可以将一个对象实例序列化为json数据。直接调用GICJsonParser
的objectSerializeToJsonData
方法即可。
TestObject *t = [TestObject gic_jsonParseObjectFromJsonData:jsonData];
NSData *serJsonData = [GICJsonParser objectSerializeToJsonData:t];
NSString *jsonString = [[NSString alloc] initWithData:serJsonData encoding:4];
NSLog(@"%@",jsonString);
同样,您也可以直接将一个NSArray序列化为JsonData,只需调用objectArraySerializeToJsonData
方法即可。
Swift的支持
类库本身已支持Swift。但是在Swift中使用时需要注意以下几点。
- 所有数据类都继承自
NSObject
。 - 由于在Swift 4中,继承自NSObject的Swift class不再默认与Objective-C桥接,因此需要在class前加上
@objcMembers
关键字。 - 不支持对Int?、Float?等值类型的可空解析。因此在定义Swift class时,避免使用值类型的可空类型。但是String、Array、Dictionary可以定义为可空类型。
作者
许可协议
JsonParser在MIT许可协议下可用。更多信息请参阅LICENSE文件。