我正在研究如下复杂的json struct ,其中"events"下的"id"代表
"events": [
{
"id": 1,
"actions": [
{
"id": 8,
"values": {
"obj_id":160,
"url": "https://www.myurl.com/"
}
},
{
"id":15,
"values":{
"obj_id":182,
"scale":200
}
}
]
}
]
我有一个抽象的MIDI Base类和多个派生类,不同的值基于不同的操作id.
public class Events
{
public int id;
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
{
//Action id 8 = Open URL
public string url { get; set; }
}
public class ScaleAction : ActionBase
{
//Action id 15 = Scale
public float scale { get; set; } = 1;
}
public class BaseSpecifiedConcreteClassConverter : DefaultContractResolver
{
protected override JsonConverter ResolveContractConverter(Type objectType)
{
if (typeof(ActionsHolder).IsAssignableFrom(objectType) && !objectType.IsAbstract)
{
return null;
}
return base.ResolveContractConverter(objectType);
}
}
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>())
{
case 8:
return new ActionsHolder
{
id = joAction["id"].Value<int>(),
values = JsonConvert.DeserializeObject<OpenURLAction>(joValues.ToString(), SpecifiedSubclassConversion)
};
case 15:
return new ActionsHolder
{
id = joAction["id"].Value<int>(),
values = JsonConvert.DeserializeObject<ScaleAction>(joValues.ToString(), SpecifiedSubclassConversion)
};
default:
return null;
}
throw new NotImplementedException();
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();returns false
}
}
然而,它不起作用. 我的自定义转换器如何才能仅对其他人的动作属性和默认转换器进行反序列化. 有人可以帮忙吗?