使用JSON.NET将属性反序列化为ExpandoObject

Mat*_*zer 14 c# serialization json.net expandoobject .net-4.5

例如,有一个像下一个的对象:

public class Container
{
   public object Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它以这种方式使用:

Container container = new Container
{
    Data = new Dictionary<string, object> { { "Text", "Hello world" } }
};
Run Code Online (Sandbox Code Playgroud)

如果我反序列化从序列化上述实例获得的JSON字符串Data,即使我提供了该属性ExpandoObjectConverter,它也不会被反序列化为ExpandoObject:

Container container = JsonConvert.Deserialize<Container>(jsonText, new ExpandoObjectConverter());
Run Code Online (Sandbox Code Playgroud)

如何反序列化使用匿名对象分配的类属性,或者至少不是具体类型ExpandoObject

编辑:

有人回答说我可以使用动态对象.这对我不起作用.我知道我可以这样做,但事实并非如此,因为我需要一个ExpandoObject.谢谢.

编辑2:

其他一些用户回答我可以将JSON字符串反序列化为ExpandoObject.这不是这个问题的目标.我需要反序列化具有动态属性的具体类型.在JSON字符串中,此属性可以是关联数组.

nic*_*k_w 27

试试这个:

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());
Run Code Online (Sandbox Code Playgroud)

我发现这样做让我得到了一个ExpandoObject电话DeserializeObject.我认为你提供的代码的问题是,当你提供一个ExpandoObjectConverter,你要求Json.Net反序列化一个Container,所以我会想象它ExpandoObjectConverter没有被使用.

编辑:

如果我用它装饰Data属性[JsonConverter(typeof(ExpandoObjectConverter))]并使用代码:

var obj = JsonConvert.DeserializeObject<Container>(jsonText);
Run Code Online (Sandbox Code Playgroud)

然后该Data属性被反序列化为ExpandoObject,而obja是Container.

  • 遗憾的是,`Data`属性不是反序列化的`ExpandoObject`,而是`JContainer`(JSON.NET特定类型).我需要整个`Data`作为`ExpandoObject`. (2认同)