web-dev-qa-db-ja.com

JSON.NETを使用してプロパティをExpandoObjectとして逆シリアル化します

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

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文字列では、このプロパティは連想配列である可能性があります。

14

これを試して:

_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.Net_にContainerの逆シリアル化を要求していることだと思います。したがって、ExpandoObjectConverterは使用されていません。

編集:

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

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

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

28
nick_w