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

15
例如,有一个像下面这样的对象:
public class Container
{
   public object Data { get; set; }
}

它的使用方法如下:

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

如果我反序列化一个从上述实例序列化得到的JSON字符串,即使我提供了ExpandoObjectConverterData属性也不会被反序列化为ExpandoObject

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

如何将分配给匿名对象或至少非具体类型的类属性反序列化为ExpandoObject

编辑:

有人回答说我可以使用动态对象。这对我不起作用。我知道我可以这样做,但这不是这种情况,因为我需要一个ExpandoObject。 谢谢。

编辑2:

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

1个回答

32

试试这个:

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());
我发现这样做可以让我从调用DeserializeObject获取一个ExpandoObject。我认为你提供的代码存在问题,因为虽然你提供了一个ExpandoObjectConverter,但是你要求Json.Net反序列化一个Container,所以我想ExpandoObjectConverter可能没有被使用。

编辑:

如果我在Data属性上使用[JsonConverter(typeof(ExpandoObjectConverter))]装饰,并使用以下代码:

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

然后将 Data 属性反序列化为 ExpandoObject,而 obj 是一个 Container


1
感谢您的努力。但是和其他回答者一样,我相信您没有仔细阅读问题。我知道我可以将JSON字符串完全反序列化为ExpandoObject。但这比较困难:我需要反序列化一个具有动态属性的具体类型。当反序列化时,我希望整个属性作为ExpandoObject返回。 - Matías Fidemraizer
啊,所以在你的例子中,“Data”属性会被反序列化为“ExpandoObject”? - nick_w
2
遗憾的是,Data 属性没有被反序列化为 ExpandoObject,而是一个 JContainer(JSON.NET 特定类型)。我需要整个 Data 作为 ExpandoObject - Matías Fidemraizer
我不知道为什么我没有收到任何通知。我要试一下! - Matías Fidemraizer
太好了,太棒了!它能正常工作。谢谢,这将是我开发中的一个很好的成就。 - Matías Fidemraizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接