using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public ActionsHolder[] actions;
[JsonConverter(typeof(BaseConverter))]
public class ActionsHolder
public int id { get; set; } = -1;
public ActionBase values { get; set; }
public abstract class ActionBase : ActionsHolder
public int obj_id { get; set; }
public class OpenURLAction : ActionBase
public string url { get; set; }
public class ScaleAction : ActionBase
public float scale { get; set; } = 1;
public class BaseConverter : JsonConverter
static JsonSerializerSettings SpecifiedSubclassConversion = new JsonSerializerSettings()
ContractResolver = new BaseSpecifiedConcreteClassConverter() ,
TypeNameHandling = TypeNameHandling.All
public override bool CanConvert(Type objectType)
return (objectType == typeof(ActionsHolder));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject joAction = JObject.Load(reader);
JObject joValues = (JObject)joAction["values"];
switch (joAction["id"].Value<int>())
id = joAction["id"].Value<int>(),
values = JsonConvert.DeserializeObject<OpenURLAction>(joValues.ToString(), SpecifiedSubclassConversion)
id = joAction["id"].Value<int>(),
values = JsonConvert.DeserializeObject<ScaleAction>(joValues.ToString(), SpecifiedSubclassConversion)
throw new NotImplementedException();
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public static void Test()
static string GetJson() =>@"
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Namespace, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");