昨天在项目中有一个需求是,需要将省市对应的plist文件转换成json文件给web端使用。那么其实做这个的需求真的很简单,需要明确两点就可以了。
1.将plist文件中对应的省市解析成数组或者是字典就可以了;
2.将对应的数组或者是字典用json的序列化器序列换成json字符串就可以了。
(1)那么首先第一步就不需要详细的说明了,直接上代码。都是一些垃圾代码
- (instancetype)initWithDict:(NSDictionary *)dict{
if (self= [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype)provinceWithDict:(NSDictionary *)dict{
return [[self alloc] initWithDict:dict];
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{}
+ (NSArray *)provincesAndCities{
NSString *path = [[NSBundle mainBundle] pathForResource:@"02cities.plist" ofType:nil];
NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *provinces = [NSMutableArray array];
for (NSDictionary *dict in dictArray){
CTProvince *province = [self provinceWithDict:dict];
[provinces addObject:province];
}
return provinces;
}
第一步就完成了,这样就生成了一个省市对应的模型对象数组了。
现在就可以使用 NSJSONSerialization 来将数组序列化成json字符串就可以啦。
但是这里有一个需要注意的地方就是我们这个数组中装的都是CTProvince模型对象,所以是不能直接转成json字符串的,那么既然这样的话,就直接搞成一个字典更好了。这样有一个键值对来互应省份和城市了。
NSMutableArray *array = [NSMutableArray array];
[self.cities enumerateObjectsUsingBlock:^(CTProvince *obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:obj.name forKey:@"name"];
[dic setObject:obj.cities forKey:@"cities"];
[array addObject:dic];
}];
NSData *data = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// 写再桌面上去喽
[jsonString writeToFile:@"/Users/ctrip/Desktop/jsonString.json" atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",jsonString);
最后打印出来的结果如下:
[
{
“province” : “福建”,
“cities” : [
“福州”,
“龙岩”,
“南平”,
“宁德”,
“莆田”,
“泉州”,
“三明”,
“厦门”,
“永安”,
“漳州”
]
},
{
“province” : “山东”,
“cities” : [
“济南”,
“滨州”,
“德州”,
“东营”,
“肥城”,
“海阳”,
“菏泽”,
“济宁”,
“莱芜”,
“莱阳”,
“聊城”,
“临沂”,
“平度”,
“青岛”,
“青州”,
“日照”,
“泰安”,
“威海”,
“潍坊”,
“烟台”,
“枣庄”,
“章丘”,
“淄博”
]
},
下面的就不复制了
……