Skip to content

Instantly share code, notes, and snippets.

@xeb
Created August 30, 2012 01:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xeb/3521416 to your computer and use it in GitHub Desktop.
Save xeb/3521416 to your computer and use it in GitHub Desktop.
JsonFormatter
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
public static class SerializationExtensions
{
public static string ToJson<T>(this T obj)
{
using (var ms = new MemoryStream())
{
var dc = new DataContractJsonSerializer(typeof(T));
dc.WriteObject(ms, obj);
string val = Encoding.UTF8.GetString(ms.ToArray());
return JsonHelper.Format(val);
//return val;
}
}
public static T FromJson<T>(this string json)
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
var dc = new DataContractJsonSerializer(typeof(T));
return (T)dc.ReadObject(ms);
}
}
public static void ForEach<T>(this IEnumerable<T> items, Action<T> doSomething)
{
foreach (var item in items)
doSomething(item);
}
}
public class JsonHelper
{
private const string _indentString = " ";
public static string Format(string str)
{
var indent = 0;
var sb = new StringBuilder();
foreach (var ch in str)
{
switch (ch)
{
case ':':
sb.Append(' ').Append(ch).Append(' ');
break;
case '[':
sb.Append(ch);
indent++;
break;
case ']':
sb.Append(ch);
indent--;
break;
case '|':
sb.AppendLine();
Enumerable.Range(0, indent + 1).ForEach(item => sb.Append(_indentString));
sb.Append(ch);
break;
case ',':
sb.Append(ch);
sb.AppendLine();
Enumerable.Range(0, indent).ForEach(item => sb.Append(_indentString));
break;
case '{':
sb.AppendLine();
Enumerable.Range(0, indent).ForEach(item => sb.Append(_indentString));
sb.Append(ch);
sb.AppendLine();
Enumerable.Range(0, ++indent).ForEach(item => sb.Append(_indentString));
break;
case '}':
sb.AppendLine();
Enumerable.Range(0, --indent).ForEach(item => sb.Append(_indentString));
sb.Append(ch);
break;
default:
sb.Append(ch);
break;
}
}
return sb.ToString();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment