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

时间:2014-10-31 12:52:15

标签: c# json json.net

我创建了几个映射到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属性以获取类型绑定信息?

1 个答案:

答案 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;
}