How can I beautify JSON for display in a TextBox?

C#Json

C# Problem Overview


How can I beautify JSON with C#? I want to print the result in a TextBox control.

Is it possible to use JavaScriptSerializer for this, or should I use JSON.net? Unless I have to, I'd like to avoid deserializing the string.

C# Solutions


Solution 1 - C#

Bit late to this party, but you can beautify (or minify) Json without deserialization using Json.NET:


JToken parsedJson = JToken.Parse(jsonString);
var beautified = parsedJson.ToString(Formatting.Indented);
var minified = parsedJson.ToString(Formatting.None);

Edit: following up on the discussion in the comments about performance, I measured using BenchMark.Net and there is an extra allocation cost using JToken.Parse, and a very small increase in time taken:

enter image description here

Benchmark code

Solution 2 - C#

With JSON.Net you can beautify the output with a specific formatting.

Demo on dotnetfiddle.

Code

public class Product
{
	public string Name {get; set;}
	public DateTime Expiry {get; set;}
	public string[] Sizes {get; set;}
}

public void Main()
{
	Product product = new Product();
	product.Name = "Apple";
	product.Expiry = new DateTime(2008, 12, 28);
	product.Sizes = new string[] { "Small" };
	
	string json = JsonConvert.SerializeObject(product, Formatting.None);
	Console.WriteLine(json);
	json = JsonConvert.SerializeObject(product, Formatting.Indented);
	Console.WriteLine(json);
}

Output

{"Name":"Apple","Expiry":"2008-12-28T00:00:00","Sizes":["Small"]}
{
  "Name": "Apple",
  "Expiry": "2008-12-28T00:00:00",
  "Sizes": [
    "Small"
  ]
}

Solution 3 - C#

You can process JSON without deserializing using the new System.Text.Json namespace, to avoid adding a dependency on json.NET. This is admittedly not as terse as stuartd's simple answer:

using System.IO;
using System.Text;
using System.Text.Json;

public static string BeautifyJson(string json)
{
    using JsonDocument document = JsonDocument.Parse(json);
    using var stream = new MemoryStream();
    using var writer = new Utf8JsonWriter(stream, new JsonWriterOptions() { Indented = true });
    document.WriteTo(writer);
    writer.Flush();
    return Encoding.UTF8.GetString(stream.ToArray());
}

The docs have more examples of how to use the low-level types in the namespace.

Solution 4 - C#

ShouldSerializeContractResolver.cs

public class ShouldSerializeContractResolver : DefaultContractResolver
    {
        public static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();

        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            JsonProperty property = base.CreateProperty(member, memberSerialization);
            return property;
        }
    }
 var beautifyJson= Newtonsoft.Json.JsonConvert.SerializeObject(data, new JsonSerializerSettings()
            {
                ContractResolver = ShouldSerializeContractResolver.Instance,
                NullValueHandling = NullValueHandling.Ignore,
                Formatting = Formatting.Indented
            });

you can beautify json with above code

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionStefanView Question on Stackoverflow
Solution 1 - C#stuartdView Answer on Stackoverflow
Solution 2 - C#aloisdgView Answer on Stackoverflow
Solution 3 - C#RedMattView Answer on Stackoverflow
Solution 4 - C#RidvanCView Answer on Stackoverflow