using System.Text; internal static class Formatter { public static string Indent = " "; public static void AppendIndent(StringBuilder sb, int count) { while (count > 0) { sb.Append(Indent); count--; } } public static bool IsEscaped(StringBuilder sb, int index) { bool escaped = false; while (index > 0 && sb[--index] == '\\') { escaped = !escaped; } return escaped; } public static string PrettyPrint(string input) { StringBuilder output = new StringBuilder(input.Length * 2); char? quote = null; int depth = 0; for (int i = 0; i < input.Length; i++) { char ch = input[i]; switch (ch) { case '[': case '{': output.Append(ch); if (!quote.HasValue) { output.AppendLine(); AppendIndent(output, ++depth); } break; case ']': case '}': if (quote.HasValue) { output.Append(ch); break; } output.AppendLine(); AppendIndent(output, --depth); output.Append(ch); break; case '"': case '\'': output.Append(ch); if (quote.HasValue) { if (!IsEscaped(output, i)) { quote = null; } } else { quote = ch; } break; case ',': output.Append(ch); if (!quote.HasValue) { output.AppendLine(); AppendIndent(output, depth); } break; case ':': if (quote.HasValue) { output.Append(ch); } else { output.Append(" : "); } break; default: if (quote.HasValue || !char.IsWhiteSpace(ch)) { output.Append(ch); } break; } } return output.ToString(); } }