使用Json.Net中的不同JsonProperty序列化类型信息

问题描述:

我已经创建了几个映射到Schema.org对象的类;使用Json.Net中的不同JsonProperty序列化类型信息

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属性的类型绑定信息?

您可以使用JsonSerializerSettings自定义序列化的参数:设置TypeNameHandling = TypeNameHandling.None让你不包括序列化的Json $类型信息,如果你有,比如说,定制的转换器的其他问题,您可以使用JsonSerializerSettings.IList<JsonConverter>设置来指定的。

更详细的信息是在这里:JsonSerializerSettings

这里:Newtonsoft.Json.TypeNameHandling

,这里是的JsonCreationConverter一个很好的例子,你可以在自己的转换器,基于JsonConverter这样overrride方法ReadJson:

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; 
} 
+0

我需要的类型信息 - 我只是不希望它被称为$类型。 FullSchemaType已被序列化,所以我想能够使用该属性。 – rikkit 2014-10-31 14:04:06

+0

那么,为什么不从这个答案实现你自己的JsonCreationConverter类呢? http://*.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of-base?rq=1 – ZuoLi 2014-10-31 14:08:11