在查看json字符串時毫玖,往往看到的是沒有格式的一大段內(nèi)容,轉(zhuǎn)換格式之后,顯示則會更加的清晰明了付枫。
使用算法如下:
對輸入字符串烹玉,逐個字符的遍歷
1、獲取當(dāng)前字符阐滩。
2二打、如果當(dāng)前字符是前方括號、前花括號做如下處理:
如果前面還有字符掂榔,并且字符為“:”继效,打印:換行和縮進(jìn)字符字符串衅疙。
打恿ぁ:當(dāng)前字符。
前方括號饱溢、前花括號喧伞,的后面必須換行。打蛹ɡ伞:換行潘鲫。
每出現(xiàn)一次前方括號、前花括號肋杖;縮進(jìn)次數(shù)增加一次溉仑。打印:新行縮進(jìn)状植。
進(jìn)行下一次循環(huán)浊竟。
3、如果當(dāng)前字符是后方括號津畸、后花括號做如下處理:
后方括號振定、后花括號,的前面必須換行肉拓。打雍笃怠:換行。
每出現(xiàn)一次后方括號暖途、后花括號卑惜;縮進(jìn)次數(shù)減少一次。打幼な邸:縮進(jìn)露久。
打印:當(dāng)前字符欺栗。
如果當(dāng)前字符后面還有字符毫痕,并且字符不為“壳快,”,打诱虿荨:換行眶痰。
繼續(xù)下一次循環(huán)。
4梯啤、如果當(dāng)前字符是逗號竖伯。逗號后面換行,并縮進(jìn)因宇,不改變縮進(jìn)次數(shù)七婴。
這里有bug,更改為【并且當(dāng)前字符后方是雙引號或左大括號】
5察滑、打哟蚶濉:當(dāng)前字符。
轉(zhuǎn)換后的格式如下圖
具體實現(xiàn)代碼為
- (NSString *)tansformJSON:(NSString *)jsonString {
NSString *resultString = @"";
NSInteger length = jsonString.length;
int number = 0;
char key = 0;
//遍歷輸入字符串贺辰。
for (int i = 0; i < length; I++)
{
//1户盯、獲取當(dāng)前字符。
key = [jsonString characterAtIndex:i];
//2饲化、如果當(dāng)前字符是前方括號莽鸭、前花括號做如下處理:
if((key == '[') || (key == '{') )
{
//(1)如果前面還有字符,并且字符為“:”吃靠,打恿蛘!:換行和縮進(jìn)字符字符串。
if((i - 1 > 0) && ([jsonString characterAtIndex:i] == ':'))
{
resultString = [resultString stringByAppendingString:@"\n"];
NSString *tempString = @"";
for (int j = 0; j <number; j ++) {
tempString = [tempString stringByAppendingString:@" "];
}
resultString = [resultString stringByAppendingString:tempString];
}
//(2)打映部椤:當(dāng)前字符礁阁。
resultString = [resultString stringByAppendingString:[NSString stringWithUTF8String:&key]];
//(3)前方括號、前花括號族奢,的后面必須換行姥闭。打印:換行歹鱼。
resultString = [resultString stringByAppendingString:@"\n"];
//(4)每出現(xiàn)一次前方括號泣栈、前花括號卜高;縮進(jìn)次數(shù)增加一次弥姻。打印:新行縮進(jìn)掺涛。
number++;
NSString *tempString = @"";
for (int j = 0; j <number; j ++) {
tempString = [tempString stringByAppendingString:@" "];
}
resultString = [resultString stringByAppendingString:tempString];
//(5)進(jìn)行下一次循環(huán)庭敦。
continue;
}
//3、如果當(dāng)前字符是后方括號薪缆、后花括號做如下處理:
if((key == ']') || (key == '}') )
{
//(1)后方括號秧廉、后花括號伞广,的前面必須換行。打犹鄣纭:換行嚼锄。
resultString = [resultString stringByAppendingString:@"\n"];
//(2)每出現(xiàn)一次后方括號、后花括號蔽豺;縮進(jìn)次數(shù)減少一次区丑。打印:縮進(jìn)修陡。
number--;
NSString *tempString = @"";
for (int j = 0; j <number; j ++) {
tempString = [tempString stringByAppendingString:@" "];
}
resultString = [resultString stringByAppendingString:tempString];
//(3)打硬捉摹:當(dāng)前字符。
resultString = [resultString stringByAppendingString:[NSString stringWithCString:&key encoding:NSUTF8StringEncoding]];
//(4)如果當(dāng)前字符后面還有字符魄鸦,并且字符不為“宴杀,”,打邮耙颉:換行旺罢。
if(((i + 1) < length) && ([jsonString characterAtIndex:(i + 1)] != ','))
{
resultString = [resultString stringByAppendingString:@"\n"];
}
//(5)繼續(xù)下一次循環(huán)。
continue;
}
//4绢记、如果當(dāng)前字符是逗號主经。逗號后面換行,并縮進(jìn)庭惜,不改變縮進(jìn)次數(shù)罩驻。
if(key == ',')
{
resultString = [resultString stringByAppendingString:[NSString stringWithUTF8String:&key]];
resultString = [resultString stringByAppendingString:@"\n"];
NSString *tempString = @"";
for (int j = 0; j <number; j ++) {
tempString = [tempString stringByAppendingString:@" "];
}
resultString = [resultString stringByAppendingString:tempString];
continue;
}
//5、打踊ど蕖:當(dāng)前字符惠遏。
resultString = [resultString stringByAppendingString:[NSString stringWithUTF8String:&key]];
}
return resultString;
}
添加縮進(jìn)時,沒有想到更好的方法骏啰,用了循環(huán)生成字符串节吮,希望大家評論區(qū)告知更好的解決方案,謝謝判耕。
NSString *tempString = @"";
for (int j = 0; j <number; j ++) {
tempString = [tempString stringByAppendingString:@" "];
}
resultString = [resultString stringByAppendingString:tempString];