C# System.Text.Json JsonElement.GetProperty()KeyNotFoundException
我现在正在尝试使用新的.net 5 System.Text.Json来分析Json文件。其中一个JsonElement.GetRawText()如下所示: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
{"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))
{
//...
}