我创建了几个映射到Schema.org对象的类;
public class Thing {
public virtual string FullSchemaType { get { return "[schema.org]Thing"; } }
}
public class CreativeWork : Thing {
public override string FullSchemaType {get {return string.Join(":", base.FullSchemaType, "CreativeWork"); } }
[JsonProperty("author")]
public string Author { get;set; }
// etc
}
public class MediaObject : CreativeWork {
public override string FullSchemaType {get {return string.Join(":", base.FullSchemaType, "MediaObject"); } }
[JsonProperty("duration")]
public float? Duration { get;set; }
}
我有一个工厂类可以创建例如MediaObject,设置其属性。 FullSchemaType属性是符合Schema.org标准的注明其类型的方式。我将这些对象放入数据库,使用Json.NET 6.0.3将它们序列化。
我想将它们反序列化为正确的C#对象。执行此操作的标准Json.Net方法是使用TypeNameHandling
- 但是在序列化的Json中插入$ type属性,这并不理想,因为我们有几个不同的应用程序与此数据库连接。
有没有办法让Json.NET查看我的FullSchemaType属性以获取类型绑定信息?
答案 0 :(得分:2)
您可以使用JsonSerializerSettings
自定义序列化参数:设置TypeNameHandling = TypeNameHandling.None
允许您不在序列化Json中包含$类型信息,如果您还有任何其他问题,比如自定义转换器,您可以使用JsonSerializerSettings.IList<JsonConverter>
设置指定一个。
更详细的信息在这里:JsonSerializerSettings
在这里:Newtonsoft.Json.TypeNameHandling
这是JsonCreationConverter的一个很好的例子,你可以在你自己的转换器中覆盖方法ReadJson,基于JsonConverter这样:
public override object ReadJson(JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
// Load JObject from stream
JObject jObject = JObject.Load(reader);
if (jObject[FullSchemaType] == {your_media_object_type_name})
MediaObject target = Create(objectType, jObject);
else if (jObject[FullSchemaType] == {your_creative_work_type_name})
CreativeWork target = Create(objectType, jObject);
else
Thing target = Create(objectType, jObject);
// Populate the object properties
serializer.Populate(jObject.CreateReader(), target);
return target;
}