Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

You can use the Newtonsoft.Json NuGet package to deserialize the JSON structure into a dynamic object, and then recursively iterate over the properties and values to flatten the structure. Here is an example implementation:

using Newtonsoft.Json.Linq;

public static class JsonFlattener
{
    public static IDictionary<string, object> Flatten(string json)
    {
        var obj = JObject.Parse(json);
        var flat = new Dictionary<string, object>();
        Flatten(null, obj, flat);
        return flat;
    }

    private static void Flatten(string prefix, JToken token, IDictionary<string, object> flat)
    {
        switch (token.Type)
        {
            case JTokenType.Object:
                foreach (var pair in ((JObject)token))
                {
                    Flatten(GetName(prefix, pair.Key), pair.Value, flat);
                }
                break;

            case JTokenType.Array:
                var index = 0;
                foreach (var item in ((JArray)token))
                {
                    Flatten(GetName(prefix, index.ToString()), item, flat);
                    index++;
                }
                break;

            default:
                flat.Add(prefix, ((JValue)token).Value);
                break;
        }
    }

    private static string GetName(string prefix, string name)
    {
        return string.IsNullOrEmpty(prefix) ? name : $"{prefix}.{name}";
    }
}

To use the flattener, simply pass a JSON string to the Flatten method:

var json = "{ \"name\": \"John\", \"age\": 30, \"address\": { \"city\": \"New York\", \"state\": \"NY\" }, \"languages\": [ \"English\", \"Spanish\", \"French\" ] }";
var flat = JsonFlattener.Flatten(json);

foreach (var pair in flat)
{
    Console.WriteLine($"{pair.Key}: {pair.Value}");
}

This will output:

name: John
age: 30
address.city: New York
address.state: NY
languages.0: English
languages.1: Spanish
languages.2: French

Note that the flattener uses dot notation to concatenate property names. This can be changed to suit your needs.