Приносим извинения за задание этого вопроса таким образом, но, по-видимому, мне недостаточно «репутации», чтобы опубликовать вопрос в качестве комментария в исходной теме.Редактирование JsonHelper
Кто-то here сделал приятный небольшой класс, чтобы правильно отстроить строку JSON, чтобы она была удобнее для людей. Он отлично работает, за исключением того, что я хотел бы изменить его так, чтобы пустые массивы были представлены как «[]», а не имели кучу пробелов между символами (новая строка, вероятно, несколько символов отступа и т. Д.). Казалось, такой простой план.
Исходный код выглядит следующим образом:
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();
}
Я попытался изменить его, так что было это в нем:
case '[':
sb.Append(ch);
if (!quoted)
{
if (str[i + 1] != ']')
{
sb.AppendLine();
Enumerable.Range(0, ++indent).ForEach(item => sb.Append(INDENT_STRING));
}
}
break;
Дует на меня, жалуясь, что я ссылки индекс это слишком велико (на самом деле он жалуется на то, что имеет ряд возможностей, скорее всего, «ArgumentOutOfRangeException» ). Я попытался добавить трекер, чтобы узнать, есть ли i+1 > str.Length
, но он все еще взрывается. И место в струне, в которую он взорвался, не находится рядом с [
или ]
. Действительно, ch
является «{» и str[i+1]
является «,».
Имею ли я смысл?
Я думал о том, чтобы просто взять результирующую строку и использовать Regex, чтобы вырвать любые пробелы между [и], но это казалось неэлегантным.
Есть ли у кого-нибудь рекомендации по изменению этого в противном случае-отличного кода так, как я хочу? Я пробовал, действительно я это сделал ...
Это сработало отлично, спасибо. –