【问题标题】:System.Text.Json JsonElement.GetProperty() KeyNotFoundExceptionSystem.Text.Json JsonElement.GetProperty() KeyNotFoundException
【发布时间】:2021-03-16 08:42:57
【问题描述】:

我现在正在尝试使用新的 .net 5 System.Text.Json 来分析 json 文件。其中一个 JsonElement.GetRawText() 看起来像:

{"name":"filter","in":"query","required":false,"type":"string"}

如果我使用:(para 是 JsonElement)

var eo = para.EnumerateObject();
while (eo.MoveNext())
{
    <div class="col col-4">
        @eo.Current.Name = @eo.Current.Value
    </div>
}

我可以看到类似“in = header”的内容。但如果我切换到:

    var paraPosition = para.GetProperty("in");

我会得到:KeyNotFoundException:给定的键不在字典中。 我是不是搞错了什么?感谢您的帮助。

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

其实就是swagger-doc生成的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 和“获取”:

var apiElement = Model.Value.EnumerateObject();
@while (apiElement.MoveNext())
{
    var get = apiElement.Current.Value.EnumerateObject();
    get.MoveNext();

到目前为止一切顺利,我可以使用 get.Current.Value.GetProperty("parameters")。

我如何获取参数和参数:

    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";

但是现在,我不能使用 para.GetProperty("in")。相反,我使用 EnumerateObject,这很丑。

好像是 JsonArray 的问题?

【问题讨论】:

  • 可以发对应的json吗?
  • 其中一个例子:{"name":"filter","in":"query","re​​quired":false,"type":"string"}
  • @Fildor 我刚刚编辑了主题。谢谢:)
  • 你是怎么到para的?如果我使用var doc=JsonDocument.Parse(json);var para=doc.RootElement; var paraPosition = para.GetProperty("in");,我无法重现该问题您发布的是具有单个对象的文档,因此只有根元素具有属性
  • 我建议创建一个仅包含 JSON 字符串和尝试访问属性的代码的新控制台应用程序。我怀疑当前代码试图迭代错误的元素。

标签: c# system.text.json


【解决方案1】:

对不起各位,原来是 json 文件的错误:并非 [parameters] 中的所有元素都具有“in”属性!所以一个段落失败了所有失败,因为它们在同一个循环中。

现在我把它改成了:

    if (para.TryGetProperty("in", out JsonElement paraPosition))
    {
       //...
    }

现在一切都很好。

我认为该文件是由 swagger 本身生成的。也许 swagger 犯了错误,或者我们中的一些开发人员犯了错误。我去看看。

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

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多