2011-10-17 8 views
1

私はオブジェクト値のプロパティを持つC#クラスを持っています。私はこのプロパティをenum値に設定しています.Jsonにシリアル化してからオブジェクトにデシリアライズします。Json.Netでenum値に設定されたオブジェクトプロパティを直列化および逆シリアル化する方法

オブジェクトのプロパティ値をデニリアライズして列挙型に戻すにはどうすればよいですか?

、与えられます。

public class Foo 
{ 
    public object Value { get; set; } 
} 
public enum SmallNumbers { One, Two, Three } 

がどのように私はこのテストに合格することができますか?

[Test] 
    public void an_object_property_set_to_an_enum_can_be_serialised() 
    { 
     var settings = new JsonSerializerSettings 
         { 
          TypeNameHandling = TypeNameHandling.Auto 
         }; 

     var json = JsonConvert.SerializeObject(
     new Foo {Value = SmallNumbers.One}, 
     Formatting.None, 
     settings); 

     var foo = JsonConvert.DeserializeObject<Foo>(json, settings); 

     Assert.That(foo.Value is SmallNumbers); 
    } 
+0

これは直接サポートされていないため、私はWaheedの答えを受け入れましたが、彼の答えはあなたが得る限り近かったです! –

答えて

1

それは、この特殊なケースのためのコンバータを書くことは可能ですが、あなたはObject型の「価値」のような多くの性質を持っている場合は、各オブジェクトを変換するためにどのタイプに伝えるために何もないので、私は役に立たないだろう。以下のコードを確認してください&あなたのマシンでテストを実行します。

using System; 
using Newtonsoft.Json; 
using NUnit.Framework; 

class StackOverflowIssue7801000 
{ 
    public enum SmallNumbers { One, Two, Three } 

    public class Foo 
    { 
     public object Value { get; set; } 
    } 

    class ObjectToSmallNumbersConverter : JsonConverter 
    { 
     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      // Not required for deserialization 
      throw new NotImplementedException(); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      return (SmallNumbers)Convert.ToInt32(reader.Value); 
     } 

     public override bool CanConvert(Type objectType) 
     { 
      return (objectType == typeof(object)); 
     } 
    } 

    [Test] 
    public void an_object_property_set_to_an_enum_can_be_serialised() 
    { 
     var settings = new JsonSerializerSettings { 
      TypeNameHandling = TypeNameHandling.All 
     }; 

     var json = JsonConvert.SerializeObject(new Foo { Value = SmallNumbers.Three }, Formatting.None, settings); 
     settings.Converters.Add(new ObjectToSmallNumbersConverter()); 
     var foo = JsonConvert.DeserializeObject<Foo>(json, settings); 
     Assert.That(foo.Value is SmallNumbers); 
    } 
} 
+0

ありがとうWaheed、それは良い例です。あなたが言うように、これはオブジェクトの型の単一のプロパティを持ち、それを逆シリアル化する方法を知っている場合にのみ機能します。値の設定タイプのシリアライゼーションに相当するものはないようですので、あなたが述べる制限以外ではこれを行うことはできません。 –

+0

ようこそショーン、それは本当ですが、私はまだJson.NETの新機能です。だから私は別の答えを見つけることができればと思います。しかし、どうしてこのようなことをする必要があるのでしょうか? –

関連する問題