From 2f2cbf911283472c3300f3aa948eec83a3bdff92 Mon Sep 17 00:00:00 2001 From: akraft Date: Fri, 17 Jan 2020 16:07:17 +0100 Subject: [PATCH 1/2] Added json beautiful option --- src/JSONWriter.cs | 115 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 2 deletions(-) diff --git a/src/JSONWriter.cs b/src/JSONWriter.cs index 6a29504..34f396c 100644 --- a/src/JSONWriter.cs +++ b/src/JSONWriter.cs @@ -13,11 +13,13 @@ namespace TinyJson //- Will only output public fields and property getters on objects public static class JSONWriter { - public static string ToJson(this object item) + public static string ToJson(this object item, bool makeBeautiful = false) { StringBuilder stringBuilder = new StringBuilder(); AppendValue(stringBuilder, item); - return stringBuilder.ToString(); + return makeBeautiful ? + MakeBeautiful(stringBuilder.ToString().ToArray()).ToString() : + stringBuilder.ToString(); } static void AppendValue(StringBuilder stringBuilder, object item) @@ -173,5 +175,114 @@ static string GetMemberName(MemberInfo member) return member.Name; } + + private static string GetTabs(int level) + { + if (level == 0) + return null; + + + var chars = new char[level]; + for (int i = 0; i < chars.Length; i++) + { + chars[i] = '\t'; + } + + return new string(chars); + } + + private static StringBuilder MakeBeautiful(char[] chars) + { + var newStringBuilder = new StringBuilder(); + var tabs = 0; + + //char? chrRight; + char? chrLeft = null; + for (var i = 0; i < chars.Length; i++) + { + var chr = chars[i]; + switch (chr) + { + case '[': + if (chrLeft.HasValue && chrLeft == ',') + { + newStringBuilder.Append('\n'); + newStringBuilder.Append($"{GetTabs(tabs)}{chr}"); + } + else + { + newStringBuilder.Append(chr); + } + + tabs++; + break; + case ']': + tabs--; + newStringBuilder.Append($"\n{GetTabs(tabs)}{chr}"); + break; + case '{': + if (chrLeft.HasValue && (chrLeft == ',' || chrLeft == '[')) + { + newStringBuilder.Append('\n'); + newStringBuilder.Append($"{GetTabs(tabs)}{chr}"); + } + else + { + newStringBuilder.Append(chr); + } + + tabs++; + break; + case '}': + tabs--; + newStringBuilder.Append($"\n{GetTabs(tabs)}{chr}"); + break; + case '"': + if (chrLeft.HasValue && (chrLeft == '{' || chrLeft == '[' || chrLeft == ',' || chrLeft == ':')) + { + if (chrLeft != ':') + { + newStringBuilder.Append('\n'); + newStringBuilder.Append($"{GetTabs(tabs)}{chr}"); + } + else + { + newStringBuilder.Append(chr); + } + + + var nextIndex = GetNextChar(chars, i + 1); + newStringBuilder.Append(new string(chars, i + 1, nextIndex - i - 1)); + i = nextIndex - 1; + chr = chars[i]; + } + else + { + newStringBuilder.Append(chr); + } + + break; + default: + newStringBuilder.Append(chr); + break; + } + + + chrLeft = chr; + } + return newStringBuilder; + } + + private static int GetNextChar(char[] chars, in int start) + { + for (var i = start; i < chars.Length; i++) + { + var chr = chars[i]; + if (chr == '"' && chars[i - 2] != '\\') + return i; + } + + return -1; + } } } From 6be3ac25bb7eee7158b90aeb5f3b4c937d22b3d1 Mon Sep 17 00:00:00 2001 From: akraft Date: Fri, 17 Jan 2020 16:12:58 +0100 Subject: [PATCH 2/2] Added usings --- src/JSONWriter.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/JSONWriter.cs b/src/JSONWriter.cs index 34f396c..23bc83a 100644 --- a/src/JSONWriter.cs +++ b/src/JSONWriter.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using System.Reflection; using System.Runtime.Serialization; using System.Text;