[Fork] https://stackoverflow.com/questions/62693720

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
					
public class Program
{
	public static void Main()
	{
		string json = @"
            {
              ""version"": 2,
              ""versioned_files"": [
                {
                  ""DB"": [
                    ""Table0"",
                    [
                      {
                        ""version"": 0,
                        ""fields"": [
                          {
                            ""name"": ""key"",
                            ""type"": ""StringU8""
                          },
                          {
                            ""name"": ""value"",
                            ""type"": ""Float""
                          }
                        ],
                        ""localised"": []
                      }
                    ]
                  ]
                },
                {
                  ""NoDbObject"": [
                    {
                      ""version"": 1,
                      ""fields"": [
                        {
                          ""name"": ""objectProp"",
                          ""type"": ""StringU8""
                        }
                      ],
                      ""localised"": []
                    }
                  ]
                }
              ]
            }";

		var root = JsonConvert.DeserializeObject<RootObject>(json);

		Console.WriteLine("Root version: " + root.Version);
		Console.WriteLine("Versioned files:");
		foreach (var vf in root.VersionedFiles)
		{
			Console.WriteLine("  Key: " + vf.Key);
			Console.WriteLine("  Label: " + (vf.Label ?? "(none)"));
			Console.WriteLine("  Items:");
			foreach (var item in vf.Items)
			{
				Console.WriteLine("    Version: " + item.Version);
				Console.WriteLine("    Fields:");
				foreach (var field in item.Fields)
				{
					Console.WriteLine("      Field name: " + field.Name);
					Console.WriteLine("      Field type: " + field.Type);
					Console.WriteLine();
				}
			}
		}
	}
}

class RootObject
{
    public int Version { get; set; }

    [JsonProperty("versioned_files")]
    public List<VersionedFile> VersionedFiles { get; set; }
}

[JsonConverter(typeof(VersionedFileConverter))]
class VersionedFile
{
    public string Key { get; set; }  // not sure if "DB" is a name or a type, so I just called it "Key"
    public string Label { get; set; }  // not sure what the "Table0" string represents, so I just called it "Label"
    public List<Item> Items { get; set; }
}

class Item
{
    public int Version { get; set; }
    public List<Field> Fields { get; set; }
    public List<object> Localised { get; set; }
}

class Field
{
    public string Name { get; set; }
    public string Type { get; set; }
}

public class VersionedFileConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(VersionedFile);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject obj = JObject.Load(reader);
        JProperty prop = obj.Properties().First();

        VersionedFile file = new VersionedFile 
        {
            Key = prop.Name,
            Items = new List<Item>() 
        };

        JArray array = (JArray)prop.Value;
        if (array.Count > 0)
        {
            if (array[0].Type == JTokenType.String)
            {
                file.Label = (string)array[0];
                file.Items = array[1].ToObject<List<Item>>(serializer);
            }
            else
            {
                file.Items = array.ToObject<List<Item>>(serializer);
            }
        }

        return file;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
;