C# System.Text.Json JsonElement.GetProperty()KeyNotFoundException

C# System.Text.Json JsonElement.GetProperty()KeyNotFoundException,c#,system.text.json,C#,System.text.json,我现在正在尝试使用新的.net 5 System.Text.Json来分析Json文件。其中一个JsonElement.GetRawText()如下所示: {"name":"filter","in":"query","required":false,"type":"string"} 如果我使用:(para是JsonElement) 我将获得:KeyNotF

我现在正在尝试使用新的.net 5 System.Text.Json来分析Json文件。其中一个JsonElement.GetRawText()如下所示:

{"name":"filter","in":"query","required":false,"type":"string"}
如果我使用:(para是JsonElement)

我将获得:KeyNotFoundException:给定的密钥不在字典中。 我做错什么了吗?谢谢你的帮助

=========================================== 更多信息:

它实际上是由swagger文档生成的json。级别如下:

RootElement/get/paths/(many apis listed as properties rather than array)/get/parameters/[para]/in
我如何获得路径:

        var jsonDocument = GetJsonDocument();
        var elementOfPaths = jsonDocument.RootElement.GetProperty(ApiNode);
        return elementOfPaths;
如何获取API和“获取”:

到目前为止,我可以使用get.Current.Value.GetProperty(“参数”)

如何获取参数和参数:

    var parameters = get.Current.Value.GetProperty("parameters");
    <div class ="row">
        @foreach (var para in parameters.EnumerateArray())
        {
            <div>@para.GetRawText()</div>
            var eo = para.EnumerateObject();
            while (eo.MoveNext())
            {
                if (eo.Current.Name != "in")
                {
                    continue;
                }

                var paraClass = eo.Current.Value.GetString() == "header" ? "text-secondary"
                    : eo.Current.Value.GetString() == "query" ? "text-info"
                        : "text-danger";
var parameters=get.Current.Value.GetProperty(“参数”);
@foreach(parameters.EnumerateArray()中的var para)
{
@第1段
var eo=para.EnumerateObject();
while(eo.MoveNext())
{
如果(eo.Current.Name!=“in”)
{
继续;
}
var paraClass=eo.Current.Value.GetString()=“标题”?“文本辅助”
:eo.Current.Value.GetString()=“查询”?“文本信息”
:“文本危险”;
但现在,我不能使用para.GetProperty(“in”),而是使用EnumerateObject,这很难看


似乎是关于JsonArray的问题?

抱歉,伙计们,原来这是json文件的一个错误:[parameters]中并非所有元素都具有“in”属性!因此一个参数失败,所有参数都失败,因为它们在同一个循环中

现在我把它改成:

    if (para.TryGetProperty("in", out JsonElement paraPosition))
    {
       //...
    }
现在一切都好了

我认为该文件是由斯威格自己生成的。可能是斯威格犯了错误,或者是我们的一些开发人员犯了错误。我会检查一下


我的灵感来自Panagiotis Kanavos的“错误元素”。再次感谢:)

您能发布相应的json吗?示例之一:{“name”:“filter”,“in”:“query”,“required”:false,“type”:“string”}@Fildor我刚刚编辑了这个主题。谢谢:)你是如何找到
para
?如果我使用
var-doc=JsonDocument.Parse(json);var-para=doc.RootElement;var-paraPosition=para.GetProperty(“in”),我无法重现这个问题;
您发布的是一个包含单个对象的文档,因此只有根元素具有属性。我建议创建一个新的控制台应用程序,其中只包含JSON字符串和尝试访问属性的代码。我怀疑当前代码试图迭代错误的元素。
var apiElement = Model.Value.EnumerateObject();
@while (apiElement.MoveNext())
{
    var get = apiElement.Current.Value.EnumerateObject();
    get.MoveNext();
    var parameters = get.Current.Value.GetProperty("parameters");
    <div class ="row">
        @foreach (var para in parameters.EnumerateArray())
        {
            <div>@para.GetRawText()</div>
            var eo = para.EnumerateObject();
            while (eo.MoveNext())
            {
                if (eo.Current.Name != "in")
                {
                    continue;
                }

                var paraClass = eo.Current.Value.GetString() == "header" ? "text-secondary"
                    : eo.Current.Value.GetString() == "query" ? "text-info"
                        : "text-danger";
    if (para.TryGetProperty("in", out JsonElement paraPosition))
    {
       //...
    }