JSON格式在C#中? [英] JSON formatter in C#?
问题描述
寻找,将采取的Json的字符串
作为输入和换行和缩进格式化的功能。验证将是一个奖金,但不是必需的,而且我也不需要将它解析为一个对象或任何东西。
任何人都知道这样一个图书馆的?
样品输入:
{地位:OK,结果:[{类型:本地,政治]的formatted_address:纽约,纽约,USA,address_components:[{LONG_NAME:纽约,简称的:纽约,类型:本地,政治]},{LONG_NAME:新纽约,简称的:纽约,类型:administrative_area_level_2,政治]},{LONG_NAME:纽约,简称的:NY,类型: administrative_area_level_1,政治]},{LONG_NAME:美的,简称的:美国,类型:国家,政治]}],几何:{位置:{纬度:40.7143528,液化天然气: - 74.0059731},LOCATION_TYPE:近似,视:{西南:{纬度:40.5788964,液化天然气: - 74.2620919}, 东北:{纬度:40.8495342,液化天然气: - 73.7498543}},界限:{西南:{纬度:40.4773990,液化天然气: - 74.2590900},东北:{纬度:40.9175770,经度: - 73.7002720}}}}]}
我更新了旧版本,现在它应该支持带引号的值,如整数和布尔值。
我重构了previous版本,并得到了最终版本:
在code是短和清洁。只需要一个扩展方法。最重要的:修复了一些错误
类JsonHelper
{
私人常量字符串indent_string会=;
公共静态字符串FormatJson(字符串str)
{
变种缩进= 0;
VAR援引= FALSE;
VAR SB =新的StringBuilder();
对于(VAR I = 0; I< str.Length;我++)
{
变种CH = STR [I]
开关(CH)
{
案件 '{':
案件 '[':
sb.Append(CH);
如果(!引用)
{
sb.AppendLine();
Enumerable.Range(0,+缩进).ForEach(项目=> sb.Append(indent_string会));
}
打破;
案件 '}':
案件 ']':
如果(!引用)
{
sb.AppendLine();
Enumerable.Range(0,--indent).ForEach(项目=> sb.Append(indent_string会));
}
sb.Append(CH);
打破;
案件 '':
sb.Append(CH);
布尔逃脱= FALSE;
VAR指数= I;
而(索引> 0安培;&安培; STR [ - 指数] =='\\\\')
!逃脱逃脱=;
如果(!转义)
!=报价报价;
打破;
案件 ',':
sb.Append(CH);
如果(!引用)
{
sb.AppendLine();
Enumerable.Range(0,缩进).ForEach(项目=> sb.Append(indent_string会));
}
打破;
案件 ':':
sb.Append(CH);
如果(!引用)
sb.Append();
打破;
默认:
sb.Append(CH);
打破;
}
}
返回sb.ToString();
}
}静态类扩展
{
公共静态无效的ForEach< T>(这个IEnumerable的< T>也就是说,动作< T>动作)
{
的foreach(VAR我在IE浏览器)
{
动作(ⅰ);
}
}
}
Looking for a function that will take a string
of Json as input and format it with line breaks and indentations. Validation would be a bonus, but isn't necessary, and I don't need to parse it into an object or anything.
Anyone know of such a library?
Sample input:
{"status":"OK", "results":[ {"types":[ "locality", "political"], "formatted_address":"New York, NY, USA", "address_components":[ {"long_name":"New York", "short_name":"New York", "types":[ "locality", "political"]}, {"long_name":"New York", "short_name":"New York", "types":[ "administrative_area_level_2", "political"]}, {"long_name":"New York", "short_name":"NY", "types":[ "administrative_area_level_1", "political"]}, {"long_name":"United States", "short_name":"US", "types":[ "country", "political"]}], "geometry":{"location":{"lat":40.7143528, "lng":-74.0059731}, "location_type":"APPROXIMATE", "viewport":{"southwest":{"lat":40.5788964, "lng":-74.2620919}, "northeast":{"lat":40.8495342, "lng":-73.7498543}}, "bounds":{"southwest":{"lat":40.4773990, "lng":-74.2590900}, "northeast":{"lat":40.9175770, "lng":-73.7002720}}}}]}
I updated the old version, now it should support unquoted values such as integers and booleans.
I refactored the previous version and got the final version: The code is shorter and cleaner. Only require one extension method. The most important: fixed some bugs.
class JsonHelper
{
private const string INDENT_STRING = " ";
public static string FormatJson(string str)
{
var indent = 0;
var quoted = false;
var sb = new StringBuilder();
for (var i = 0; i < str.Length; i++)
{
var ch = str[i];
switch (ch)
{
case '{':
case '[':
sb.Append(ch);
if (!quoted)
{
sb.AppendLine();
Enumerable.Range(0, ++indent).ForEach(item => sb.Append(INDENT_STRING));
}
break;
case '}':
case ']':
if (!quoted)
{
sb.AppendLine();
Enumerable.Range(0, --indent).ForEach(item => sb.Append(INDENT_STRING));
}
sb.Append(ch);
break;
case '"':
sb.Append(ch);
bool escaped = false;
var index = i;
while (index > 0 && str[--index] == '\\')
escaped = !escaped;
if (!escaped)
quoted = !quoted;
break;
case ',':
sb.Append(ch);
if (!quoted)
{
sb.AppendLine();
Enumerable.Range(0, indent).ForEach(item => sb.Append(INDENT_STRING));
}
break;
case ':':
sb.Append(ch);
if (!quoted)
sb.Append(" ");
break;
default:
sb.Append(ch);
break;
}
}
return sb.ToString();
}
}
static class Extensions
{
public static void ForEach<T>(this IEnumerable<T> ie, Action<T> action)
{
foreach (var i in ie)
{
action(i);
}
}
}
这篇关于JSON格式在C#中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!