最近在做智能家居項(xiàng)目的時(shí)候,由于涉及到留言诚镰、音頻奕坟、視頻的上傳祥款。服務(wù)端并不知道,那些數(shù)據(jù)客戶(hù)端真正想要保存的月杉。所以和后臺(tái)商量刃跛,客戶(hù)端去上傳Json到服務(wù)端,服務(wù)端讀取Json串中的信息苛萎,選擇性的保存客戶(hù)端上傳的服務(wù)端的數(shù)據(jù)桨昙。
應(yīng)用場(chǎng)景:一般在向后臺(tái)上傳大量的圖片、音頻類(lèi)等東西腌歉。后臺(tái)為了讀懂我們上傳的是什么東西蛙酪、需要保存那些上傳的東西,一般都會(huì)叫我們上傳Json串翘盖。
當(dāng)然構(gòu)造Json串有很多的方法滤否。
1)手動(dòng)拼接Json串,如果需要拼接的串比較長(zhǎng)最仑,就會(huì)顯得比較繁瑣藐俺,而且容易錯(cuò)誤。
2)可以利用RunTime去拼接泥彤,只需要傳入一個(gè)已經(jīng)實(shí)例化的對(duì)象就能一行代碼實(shí)現(xiàn)構(gòu)建Json字符串欲芹。
思路:利用運(yùn)行時(shí)將某一個(gè)類(lèi)中的所有屬性動(dòng)態(tài)讀取出來(lái),根據(jù)屬性的名字利用kvc去獲取值吟吝。然后將屬性和對(duì)應(yīng)的值存入到字典中菱父,再序列化字典成data類(lèi)型。再將data轉(zhuǎn)換為string類(lèi)型剑逃。
1)獲取所有成員變量名字浙宜,遍歷出所有的成員變量,存入到數(shù)組中
-(NSDictionary *)propertyOfJosnModel:(JsonModel *)model{
unsigned int count;
// 1. 獲得類(lèi)中的所有成員變量
Ivar *ivarList = class_copyIvarList([model class], &count);
NSMutableArray *properNames =[NSMutableArray array];
for (int i = 0; i < count; i++){
Ivar ivar = ivarList[i];
// 2.獲得成員屬性名
NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
// 3.除去下劃線蛹磺,從第一個(gè)角標(biāo)開(kāi)始截取
NSString *key = [name substringFromIndex:1];
[properNames addObject:key];
}
return [self SetValueAddKey:model WithNameAry:properNames];
}
2)讀取保存在數(shù)組中的變量名字粟瞬,然后利用KVC去獲取到對(duì)應(yīng)的Value。然后存入到字典中
- (NSDictionary * )SetValueAddKey:(JsonModel *)model
WithNameAry:(NSArray *)names{
NSMutableDictionary * dic = [[NSMutableDictionary alloc] init];
for (NSString * name in names) {
[dic setValue:[model valueForKey:name] forKey:name];
}
return dic;
}
3)直接調(diào)用方法萤捆,將字典序列化data裙品,再轉(zhuǎn)換為字符串。
-(NSString *)convertModelToJosn:(JsonModel *)model{
NSDictionary * dic = [self propertyOfJosnModel:model];
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:nil];
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
調(diào)用的時(shí)候俗或,只需要調(diào)用convertModelToJosn市怎,就能實(shí)現(xiàn)一行代碼轉(zhuǎn)Json串。