动态检索json元素.NET 6

i7uaboj4  于 2023-03-20  发布在  .NET
关注(0)|答案(2)|浏览(146)

我想从JSON字符串中检索单个值。
以前我是这样使用Newtonsoft的:

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

但我似乎无法让它在.NET 6中工作:
我已经试过了:

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

这会导致以下错误:
未处理的异常。Microsoft。CSharp。运行时绑定器。运行时绑定器异常:System.Text.Json.JsonElement.this[int]“的最佳重载方法匹配具有一些无效参数

vmpqdwk3

vmpqdwk31#

阅读了这个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);
    }
}

对我来说似乎很管用。
正如@robnick的评论所说,您还可以链接GetProperty以获得数据结构的嵌套属性。

var quote = rootElement.GetProperty("contents")
                       .GetProperty("quotes")[0]
                       .GetProperty("quote")
                       .GetString();
8zzbczxx

8zzbczxx2#

以防万一别人在搜索这个主题的时候发现这个...
如果直接解析为JSON节点,则可以在单个GetValue中获取数据。
示例(使用显式类型以保持清晰,使用“!"处理空值):

JsonNode? jnode = JsonNode.Parse(jsonString);
string quote = jnode["contents"]!["quotes"]!.AsArray()[0]!["quote"]!.GetValue<string>();

相关问题