CSharp · Console
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();
}
}