Created
October 1, 2019 10:44
-
-
Save lordlycastle/755a9d4e34600bc881fe70d3201e516e to your computer and use it in GitHub Desktop.
A basic script that allows you to format JSON string.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
namespace Luminous.Tools | |
{ | |
/// <summary> | |
/// A utility to format JSON in pretty text. | |
/// </summary> | |
public static class JsonFormatter | |
{ | |
private const string INDENT_STRING = " "; | |
/// <summary> | |
/// Format the JSON to pretty text. | |
/// </summary> | |
/// <param name="str"></param> | |
/// <returns></returns> | |
public static string FormatJson(string str) | |
{ | |
if (string.IsNullOrEmpty(str)) | |
{ | |
Console.WriteLine($"Passed string: {str} was null or empty. Cannot format. Returning empty string."); | |
return string.Empty; | |
} | |
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); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment