动态检索 json 元素 .NET 6

Ste*_*fan 5 .net c# json .net-6.0

我想从 json 字符串中检索单个值。

以前我Newtonsoft这样使用:

var jsonString = @"{ ""MyProp"" : 5 }";
dynamic obj = Newtonsoft.Json.Linq.JObject.Parse(jsonString);
        
Console.WriteLine(obj["MyProp"].ToString());

Run Code Online (Sandbox Code Playgroud)

但我似乎无法让它在 .NET 6 中工作:

到目前为止我已经尝试过:

var jsonString = @"{ ""MyProp"" : 5 }";
dynamic obj = await System.Text.Json.JsonSerializer.Deserialize<dynamic>(jsonString);
        
Console.WriteLine(obj.MyProp.ToString());
Run Code Online (Sandbox Code Playgroud)

这会导致此错误:

未处理的异常。Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“System.Text.Json.JsonElement.this[int]”的最佳重载方法匹配有一些无效参数

Ste*_*fan 5

阅读此github后,我使用这种方法取得了成功:

NET 6 将包含可用于序列化和反序列化动态数据的 JsonNode 类型。

尝试它的结果是:

using System;
                    
public class Program
{
    public static void Main()
    {
        var jsonString = @"{ ""MyProp"" : 5 }";
        //parse it
        var myObject = System.Text.Json.JsonDocument.Parse(jsonString);
        //retrieve the value
        var myProp= myObject.RootElement
                            .GetProperty("MyProp");
        
        Console.WriteLine(myProp);
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎适用于我的情况。


正如 @robnick 的评论 - 您还可以链接GetProperty以获取数据结构的嵌套属性。

var quote = rootElement.GetProperty("contents")
                       .GetProperty("quotes")[0]
                       .GetProperty("quote")
                       .GetString();
Run Code Online (Sandbox Code Playgroud)