是否可以使用 System.Text.Json 将 json 字符串反序列化为动态对象?

Is it possible to deserialize json string into dynamic object using System.Text.Json?

我正在使用 System.Text.Json 包来使用序列化和反序列化。

当像下面这样明确指定类型时,我可以将 json 字符串反序列化为一个对象。

var data = JsonSerializer.Deserialize<PersonType>(jsonString);

但是动态类型不行。是否可以在不指定类型的情况下进行反序列化?谢谢!

var data = JsonSerializer.Deserialize<dynamic>(jsonString);

tl:dr JsonNode is the recommended way but dynamic typing with deserializing to ExpandoObject 有效,我不确定为什么。

无法以您想要的方式反序列化为动态。 JsonSerializer.Deserialize<T>() 将解析结果转换为 T。将某些内容转换为 dynamic 类似于转换为 object

Type dynamic behaves like type object in most circumstances. In particular, any non-null expression can be converted to the dynamic type. The dynamic type differs from object in that operations that contain expressions of type dynamic are not resolved or type checked by the compiler. The compiler packages together information about the operation, and that information is later used to evaluate the operation at run time

docs.

以下代码片段显示了您的示例中发生的这种情况。

var jsonString = "{\"foo\": \"bar\"}";
dynamic data = JsonSerializer.Deserialize<dynamic>(jsonString);
Console.WriteLine(data.GetType());

输出:System.Text.Json.JsonElement

推荐的方法是使用新的 JsonNode,它具有获取值的简单方法。它是这样工作的:

JsonNode data2 = JsonSerializer.Deserialize<JsonNode>(jsonString);
Console.WriteLine(data2["foo"].GetValue<string>());

最后尝试了这个对我有用,并给了你想要的,但我正在努力寻找关于它为什么起作用的文档,因为根据 this issue 它不应该被支持,但这对我有用。我的 System.Text.Json 软件包是版本 4.7.2

dynamic data = JsonSerializer.Deserialize<ExpandoObject>(jsonString);
Console.WriteLine(data.GetType());
Console.WriteLine(data.foo);