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

时间:2013-03-16 22:12:36

标签: c# serialization json.net .net-4.5 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字符串中,此属性可以是关联数组。

1 个答案:

答案 0 :(得分:28)

试试这个:

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