Код IT
← Каталог

JSON CSV конвертер на CSharp — JSON → CSV (динамически)

Фрагмент из «JSON CSV конвертер на CSharp»: JSON → CSV (динамически).

C# main.cs
using Система.Text;
using Система.Text.Json;

public static class DynamicJsonToCsv
{
    public static string Convert(string json)
    {
        using var doc = JsonDocument.Parse(json);
        if (doc.RootElement.ValueKind != JsonValueKind.Array)
            throw new ArgumentException("Корневой элемент должен быть массивом.");

        var csv = new StringBuilder();
        bool headerWritten = false;

        foreach (var item in doc.RootElement.EnumerateArray())
        {
            if (item.ValueKind != JsonValueKind.Object)
                continue;

            if (!headerWritten)
            {
                var headers = string.Join(",", GetPropertyNames(item));
                csv.AppendLine(headers);
                headerWritten = true;
            }

            var values = GetPropertyValues(item);
            csv.AppendLine(string.Join(",", values.Select(EscapeCsvField)));
        }

        return csv.ToString();
    }

    private static IEnumerable<string> GetPropertyNames(JsonElement obj)
    {
        foreach (var prop in obj.EnumerateObject())
            yield return prop.Name;
    }

    private static IEnumerable<string> GetPropertyValues(JsonElement obj)
    {
        foreach (var prop in obj.EnumerateObject())
        {
            yield return prop.Value.ValueKind switch
            {
                JsonValueKind.String => prop.Value.GetString() ?? "",
                JsonValueKind.Number => prop.Value.GetDecimalToString
                JsonValueKind.True => "true",
                JsonValueKind.False => "false",
                JsonValueKind.Null => "",
                _ => prop.Value.ToString()
            };
        }
    }

    private static string EscapeCsvField(string field)
    {
        if (field.Contains(',') || field.Contains('"') || field.Contains('\n'))
            return $"\"{field.Replace("\"", "\"\"")}\"";
        return field;
    }
}
using Система.Text;
using Система.Text.Json;

public static class DynamicJsonToCsv
{
    public static string Convert(string json)
    {
        using var doc = JsonDocument.Parse(json);
        if (doc.RootElement.ValueKind != JsonValueKind.Array)
            throw new ArgumentException("Корневой элемент должен быть массивом.");

        var csv = new StringBuilder();
        bool headerWritten = false;

        foreach (var item in doc.RootElement.EnumerateArray())
        {
            if (item.ValueKind != JsonValueKind.Object)
                continue;

            if (!headerWritten)
            {
                var headers = string.Join(",", GetPropertyNames(item));
                csv.AppendLine(headers);
                headerWritten = true;
            }

            var values = GetPropertyValues(item);
            csv.AppendLine(string.Join(",", values.Select(EscapeCsvField)));
        }

        return csv.ToString();
    }

    private static IEnumerable<string> GetPropertyNames(JsonElement obj)
    {
        foreach (var prop in obj.EnumerateObject())
            yield return prop.Name;
    }

    private static IEnumerable<string> GetPropertyValues(JsonElement obj)
    {
        foreach (var prop in obj.EnumerateObject())
        {
            yield return prop.Value.ValueKind switch
            {
                JsonValueKind.String => prop.Value.GetString() ?? "",
                JsonValueKind.Number => prop.Value.GetDecimalToString
                JsonValueKind.True => "true",
                JsonValueKind.False => "false",
                JsonValueKind.Null => "",
                _ => prop.Value.ToString()
            };
        }
    }

    private static string EscapeCsvField(string field)
    {
        if (field.Contains(',') || field.Contains('"') || field.Contains('\n'))
            return $"\"{field.Replace("\"", "\"\"")}\"";
        return field;
    }
}