Try it yourself with our free Json To Csv tool — runs entirely in your browser, no signup needed.

How to Convert JSON to CSV in C#

How to Convert JSON to CSV in C#

Converting JSON to CSV is a common task in data processing and analysis. JSON (JavaScript Object Notation) is a lightweight data interchange format, while CSV (Comma Separated Values) is a widely used format for tabular data. In C#, converting JSON to CSV can be achieved using the System.Text.Json namespace and a few helper classes. In this article, we'll explore a practical approach to converting JSON to CSV in C#.

Quick Example

Here's a minimal example that converts a JSON string to a CSV string:

using System;
using System.Text.Json;
using System.Text.Json.Serialization;

public class JsonToCsvConverter
{
    public static string ConvertJsonToCsv(string json)
    {
        var options = new JsonSerializerOptions { WriteIndented = false };
        var jsonData = JsonDocument.Parse(json);
        var csv = string.Join(",", jsonData.RootElement.EnumerateObject().Select(x => $"{x.Name}:{x.Value.GetString()}"));
        return csv;
    }
}

// Example usage:
var json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
var csv = JsonToCsvConverter.ConvertJsonToCsv(json);
Console.WriteLine(csv); // Output: name:John,age:30,city:New York

This example uses the System.Text.Json namespace to parse the JSON string and extract the key-value pairs. The EnumerateObject method is used to iterate over the JSON object, and the Select method is used to transform each key-value pair into a CSV string.

Step-by-Step Breakdown

Let's walk through the code line by line:

  1. var options = new JsonSerializerOptions { WriteIndented = false };: We create a new instance of JsonSerializerOptions and set WriteIndented to false, which tells the serializer to produce a compact JSON output.
  2. var jsonData = JsonDocument.Parse(json);: We parse the JSON string using the JsonDocument.Parse method, which returns a JsonDocument object.
  3. var csv = string.Join(",", jsonData.RootElement.EnumerateObject().Select(x => $"{x.Name}:{x.Value.GetString()}"));: We use the EnumerateObject method to iterate over the JSON object and extract the key-value pairs. The Select method is used to transform each key-value pair into a CSV string. The $"{x.Name}:{x.Value.GetString()}" expression uses string interpolation to create a string in the format key:value.

Handling Edge Cases

Empty/Null Input

If the input JSON string is empty or null, the JsonDocument.Parse method will throw an exception. We can add a simple null check to handle this case:

public static string ConvertJsonToCsv(string json)
{
    if (string.IsNullOrEmpty(json))
    {
        return string.Empty;
    }
    // ...
}

Invalid Input

If the input JSON string is invalid, the JsonDocument.Parse method will throw an exception. We can add a try-catch block to handle this case:

public static string ConvertJsonToCsv(string json)
{
    try
    {
        var jsonData = JsonDocument.Parse(json);
        // ...
    }
    catch (JsonException ex)
    {
        return $"Invalid JSON: {ex.Message}";
    }
}

Large Input

If the input JSON string is very large, we may need to use a more efficient parsing approach. We can use the JsonDocument.Parse method with the JsonDocumentOptions parameter to specify a larger buffer size:

public static string ConvertJsonToCsv(string json)
{
    var options = new JsonDocumentOptions { BufferSize = 1024 * 1024 }; // 1MB buffer size
    var jsonData = JsonDocument.Parse(json, options);
    // ...
}

Unicode/Special Characters

If the input JSON string contains Unicode or special characters, we may need to use a different encoding to ensure that the characters are properly escaped. We can use the Encoding class to specify a different encoding:

public static string ConvertJsonToCsv(string json)
{
    var encoding = Encoding.UTF8;
    var jsonData = JsonDocument.Parse(json, encoding);
    // ...
}

Common Mistakes

1. Not handling null input

Wrong code:

public static string ConvertJsonToCsv(string json)
{
    var jsonData = JsonDocument.Parse(json);
    // ...
}

Corrected code:

public static string ConvertJsonToCsv(string json)
{
    if (string.IsNullOrEmpty(json))
    {
        return string.Empty;
    }
    var jsonData = JsonDocument.Parse(json);
    // ...
}

2. Not handling invalid input

Wrong code:

public static string ConvertJsonToCsv(string json)
{
    var jsonData = JsonDocument.Parse(json);
    // ...
}

Corrected code:

public static string ConvertJsonToCsv(string json)
{
    try
    {
        var jsonData = JsonDocument.Parse(json);
        // ...
    }
    catch (JsonException ex)
    {
        return $"Invalid JSON: {ex.Message}";
    }
}

3. Not handling large input

Wrong code:

public static string ConvertJsonToCsv(string json)
{
    var jsonData = JsonDocument.Parse(json);
    // ...
}

Corrected code:

public static string ConvertJsonToCsv(string json)
{
    var options = new JsonDocumentOptions { BufferSize = 1024 * 1024 }; // 1MB buffer size
    var jsonData = JsonDocument.Parse(json, options);
    // ...
}

Performance Tips

  1. Use the JsonDocument class instead of JObject or JArray for parsing JSON.
  2. Use the EnumerateObject method to iterate over the JSON object instead of using foreach.
  3. Use string interpolation to create CSV strings instead of using string.Format.

FAQ

Q: What is the difference between JsonDocument and JObject?

A: JsonDocument is a lightweight, read-only JSON parser, while JObject is a mutable JSON object.

Q: How do I handle null input?

A: Use a null check to return an empty string or throw an exception.

Q: How do I handle invalid input?

A: Use a try-catch block to catch JsonException and return an error message.

Q: How do I handle large input?

A: Use the JsonDocumentOptions parameter to specify a larger buffer size.

Q: How do I handle Unicode/special characters?

A: Use the Encoding class to specify a different encoding.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp