15

たとえば、次のようなオブジェクトがあります。

public class Container
{
   public object Data { get; set; }
}

そしてそれはこのように使用されます:

Container container = new Container
{
    Data = new Dictionary<string, object> { { "Text", "Hello world" } }
};

上記のインスタンスをシリアル化して取得したJSON文字列を逆シリアル化すると、Dataプロパティは、を指定しても、 :ExpandoObjectConverterとして逆シリアル化されません。ExpandoObject

Container container = JsonConvert.Deserialize<Container>(jsonText, new ExpandoObjectConverter());

匿名オブジェクトで割り当てられたクラスプロパティ、または少なくとも具体的なタイプではないクラスプロパティを逆シリアル化するにはどうすればよいExpandoObjectですか?

編集:

誰かが私が動的オブジェクトを使うことができると答えました。これは私にはうまくいきません。私はこの方法で進むことができることを知っていますが、ExpandoObjectが必要なため、そうではありません。ありがとう。

編集2:

他のユーザーは、JSON文字列をに逆シリアル化できると答えましたExpandoObject。これはこの質問の目的ではありません。動的プロパティを持つ具象型を逆シリアル化する必要があります。JSON文字列では、このプロパティは連想配列である可能性があります。

4

1 に答える 1

31

これを試して:

Container container = new Container
{
    Data = new Dictionary<string, object> { { "Text", "Hello world" } }
};

string jsonText = JsonConvert.SerializeObject(container);

var obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonText, new ExpandoObjectConverter());

ExpandoObjectこれを行うことで、への呼び出しから私を得ることができましたDeserializeObject。提供したコードの問題は、を提供しているときに、の逆シリアル化ExpandoObjectConverterを要求していることだと思います。そのため、は使用されていないと思います。Json.NetContainerExpandoObjectConverter

編集:

Dataプロパティをで装飾し[JsonConverter(typeof(ExpandoObjectConverter))]てコードを使用する場合:

var obj = JsonConvert.DeserializeObject<Container>(jsonText);

次に、Dataプロパティはに逆シリアル化されますがExpandoObjectobjContainerです。

于 2013-03-18T09:09:26.483 に答える