2

私はJson.NETバージョン4.5を使用していますが、Json.Netは非常に初めてです。

問題:Json.NETでクラスのバージョン管理をサポートする方法を知る必要があります。

例:以下の例に示すように、2番目のバージョンにEmployeeDetailクラスがあり、NameプロパティはFirstNameとLastNameに分割されています。単一のアドレスがアドレスになります。

オブジェクトの逆シリアル化中に下位互換性を提供するためにカスタムJsonConverterを使用しようとしましたが、以下の例に示すように、インターフェイスをConcreteTypeにマップする一般的なカスタム作成JsonConverterをすでに使用しているため、複数のコンバーターを使用する際に問題が発生しました。

    // 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] を追加することは、ここでは適切なオプションではありません。この代わりに と で設定JsonSerializerSettingsTypeNameHandling = TypeNameHandling.Objectsてみてください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 );

Address オブジェクトが変更されていない場合は、シリアル化する必要があります。それ以外の場合は、これにも別のコンバーターが必要です。

そして、これらの両方のコンバーターをに渡す必要がありますDeserializeObject

このコードを実際にテストしていないので、不明な点があればお知らせください

于 2012-11-19T04:59:43.163 に答える