簡體   English   中英

Json.Net 未正確序列化版本類型

[英]Json.Net Not Serializing Version Type properly

當我序列化一個沒有指定修訂或內部版本號的 Version 對象時,它不能被反序列化。 有沒有人見過這個?

這是我的代碼:

JsonSerializerSettings JsonSettings = new JsonSerializerSettings()
        {
            TypeNameHandling = TypeNameHandling.Objects,
            DateFormatHandling = DateFormatHandling.IsoDateFormat,
            DateTimeZoneHandling = DateTimeZoneHandling.Utc,
            NullValueHandling = NullValueHandling.Ignore
        };


var ver = new Version(1000, 1);
var str = JsonConvert.SerializeObject(ver, Newtonsoft.Json.Formatting.Indented, JsonSettings);
var ver2 = JsonConvert.DeserializeObject(str, JsonSettings);

這實際上是有道理的,因為 json 字符串是:

{
    "$type": "System.Version, mscorlib",
    "Major": 1000,
    "Minor": 1,
    "Build": -1,
    "Revision": -1,
    "MajorRevision": -1,
    "MinorRevision": -1
}

無論如何,我是否可以在不設置 Revision 和 Build 的情況下反序列化它?

由於System.Version沒有默認構造函數,您需要使用自定義轉換器:

public class VersionConverter : JsonConverter
{
    public override void WriteJson(
        JsonWriter writer,
        object value,
        JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(
        JsonReader reader,
        Type objectType,
        object existingValue,
        JsonSerializer serializer)
    {
        JObject obj = serializer.Deserialize<JObject>(reader);

        int major = obj["Major"].ToObject<int>();
        int minor = obj["Minor"].ToObject<int>();

        Version v = new Version(major, minor);

        return v;
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(Version).IsAssignableFrom(objectType);
    }

    public override bool CanWrite { get { return false; } }
}

(請注意,您可以將其擴展為以類似方式考慮其他參數,如buildrevision

用法:

JsonSerializerSettings JsonSettings = new JsonSerializerSettings()
{
    TypeNameHandling = TypeNameHandling.Objects,
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc,
    NullValueHandling = NullValueHandling.Ignore,
    Converters = new[] { new VersionConverter() }
};


var ver = new Version(1000, 1);
var str = JsonConvert.SerializeObject(
              ver, Newtonsoft.Json.Formatting.Indented, JsonSettings);

var ver2 = JsonConvert.DeserializeObject<Version>(str, JsonSettings); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM