【问题标题】:Json.Net Not Serializing Version Type properlyJson.Net 未正确序列化版本类型
【发布时间】:2015-02-03 17:04:48
【问题描述】:

当我序列化一个没有指定修订或内部版本号的版本对象时,它不能被反序列化。有人见过这个吗?

这是我的代码:

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 的情况下反序列化它吗?

【问题讨论】:

  • 你能显示Version类吗?
  • 你期待什么?哪里有问题?你有什么问题?
  • 我希望能够反序列化它,但我不能
  • 没关系,我没有意识到有一个 System.Version 类。

标签: c# json serialization json.net deserialization


【解决方案1】:

由于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); 

【讨论】:

  • 有什么方法可以在不指定要反序列化的类型的情况下使用它吗?我不能做“JsonConvert.DeserializeObject”,我需要能够做JsonConvert.DeserializeObject
  • @Jeeve:我担心你会这么说。我会继续挖掘并告诉你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多