2

我正在使用 Json.NET 4.5 版,我对 Json.Net 很陌生。

问题:我需要知道如何在 Json.NET 中支持类的版本控制。

示例:如下例所示,我在第二个版本中有 EmployeeDetail 类,Name 属性分为 FirstName 和 LastName;并且单个地址成为地址。

我尝试使用自定义 JsonConverter 在反序列化对象时提供向后兼容性,但是在使用多个转换器时遇到了问题,因为我已经在使用通用的自定义创建 JsonConverter,它将接口映射到 ConcreteType,如下例所示。

    // Employee Detail Version 1.0
    [JsonObject()]
    public class EmployeeDetail
    {
        public EmployeeDetail()
        {

        }

        public EmployeeDetail( string name )
        {
            Name = name;
        }

        [JsonProperty]
        public string Name { get; set; }

        [JsonConverterAttribute( typeof( CustomObjectCreationConverter<iAddress, Address> ) )]
        public iAddress Address { get; set; }

    }

    // Employee Detail Version 2.0
    [JsonObject()]
    public class EmployeeDetail
    {
        public EmployeeDetail()
        {

        }

        public EmployeeDetail( string firstName, string lastName )
        {
            FirstName = firstName;
            LastName = lastName;
        }

        [JsonProperty]
        public string FirstName { get; set; }

        [JsonProperty]
        public string LastName { get; set; }

        [JsonConverterAttribute( typeof( CustomArrayCreationConverter<iAddress, Address> ) )]
        public IEnumerable<iAddress> Addresses { get; set; }

    }
4

1 回答 1

2

在这里向属性添加属性 [JsonConverterAttribute] 不是一个好的选择。而不是这个尝试JsonSerializerSettings使用TypeNameHandling = TypeNameHandling.Objectsand设置TypeNameAssemblyFormat = FormatterAssemblyStyle.Full

所以在使用设置序列化之后,Json 字符串将包含标签,如 "Address":{"$type":"...

您可以使用 jObject.Property("Address").Value 获得它

Var AddressValue = jObject.Property( "Address" ).Value
JsonTextReader textReader = new JsonTextReader( new StringReader( AddressValue.ToString() ) );
iAddress myAddress = serializer.Deserialize<iAddress>( textReader );

现在,如果地址对象没有改变,那么它应该为你序列化它,否则你也需要另一个转换器。

这两个转换器都需要传递给DeserializeObject.

我还没有实际测试过这段代码,所以如果事情不清楚,请告诉我

于 2012-11-19T04:59:43.163 回答