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. 我认为您提供的代码的问题在于,当您提供 aExpandoObjectConverter时,您要求Json.Net反序列化 a Container,所以我想aExpandoObjectConverter没有被使用。

编辑:

如果我用以下代码装饰Data房产并使用:[JsonConverter(typeof(ExpandoObjectConverter))]

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

然后该Data属性被反序列化为一个ExpandoObjectobj而是一个Container

于 2013-03-18T09:09:26.483 回答