版本0.9.2

GICJsonParser 0.9.2

ghwghw4维护。



  • GitHub仓库
  • CocoaPods.org页面

龚海伟

CI Status Version License Platform

GitHub仓库

GICJsonParser

示例

为了运行示例项目,首先克隆该仓库,然后从Example目录运行pod install

pod 'GICJsonParser'

安装

通过CocoaPods可以使用JsonParser。要安装它,只需将以下行添加到您的Podfile中。

介绍

  1. 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"
}
  1. 示例
#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. 步骤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];

注意点:

  1. 关于数组的解析。

    由于Objective-C没有泛型概念,因此解析器并不知道数组中具体保存什么类型的数据。因此需要通过GICJsonParserDelegate明确告知解析器数组中存储的数据类型。也就是说,需要实现jsonParseArrayObjectClass这个方法,即使一个类中包含多个数组也没有问题,只需根据属性名称返回正确的Class即可。

    如果返回nil或者没有实现jsonParseArrayObjectClass方法,那么解析器会默认将原始的json array赋值到该属性上。

    例如,在直接解析字符串数组或数字数组时,如不返回nil或不实现jsonParseArrayObjectClass方法,则可以成功解析。

  2. 自定义属性名称与Json key的映射。

    有时候json数据中定义的key与数据结构中定义的属性名称不一致,也可以通过实现GICJsonParserDelegate中的jsonParsePropertNameMap方法明确告知解析器属性名称与json key的映射关系。例如示例中的:testCustomPropertyNameMap与customPropertyName的映射关系。

序列化

使用GICJsonParser也可以将一个对象实例序列化为json数据。直接调用GICJsonParserobjectSerializeToJsonData方法即可。

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中使用时需要注意以下几点。

  1. 所有数据类都继承自NSObject
  2. 由于在Swift 4中,继承自NSObject的Swift class不再默认与Objective-C桥接,因此需要在class前加上@objcMembers关键字。
  3. 不支持对Int?、Float?等值类型的可空解析。因此在定义Swift class时,避免使用值类型的可空类型。但是String、Array、Dictionary可以定义为可空类型。

作者

海伟, [email protected]

许可协议

JsonParser在MIT许可协议下可用。更多信息请参阅LICENSE文件。