Estoy probando el nuevo .net 5 System.Text.Json para analizar un archivo json ahora. Uno de los JsonElement.GetRawText() se ve así:
{"name":"filter","in":"query","required":false,"type":"string"}Si uso: (para es el JsonElement)
var eo = para.EnumerateObject(); while (eo.MoveNext()) { <div class="col col-4"> @eo.Current.Name = @eo.Current.Value </div> }Puedo ver algo como "en = encabezado". Pero si cambio a:
var paraPosition = para.GetProperty("in");Obtendré: KeyNotFoundException: la clave dada no estaba presente en el diccionario. ¿Me equivoqué en algo? Gracias por la ayuda.
========================================== Más información:
De hecho, es un json generado por swagger-doc. Los niveles son como:
RootElement/get/paths/(many apis listed as properties rather than array)/get/parameters/[para]/inCómo obtengo caminos:
var jsonDocument = GetJsonDocument(); var elementOfPaths = jsonDocument.RootElement.GetProperty(ApiNode); return elementOfPaths;Cómo obtengo apis y "obtener":
var apiElement = Model.Value.EnumerateObject(); @while (apiElement.MoveNext()) { var get = apiElement.Current.Value.EnumerateObject(); get.MoveNext();hasta ahora todo bien, puedo usar get.Current.Value.GetProperty("parámetros").
Cómo obtengo parámetros y para:
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";Pero ahora, no puedo usar para.GetProperty("in"). En cambio, uso EnumerateObject, que es feo.
Parece que es algo sobre el JsonArray?
Lo siento chicos, resultó que es un error del archivo json: ¡No TODOS los elementos en [parámetros] tienen la propiedad "in"! Entonces, un para falla, todos fallan, ya que están en el mismo bucle.
Ahora lo cambié a:
if (para.TryGetProperty("in", out JsonElement paraPosition)) { //... }Todo está bien ahora.
Creo que el archivo fue generado por Swagger. Tal vez Swagger cometió el error, o algunos de nuestros desarrolladores lo hicieron. Yo lo comprobaré.
Y obtuve la inspiración de las palabras "elemento equivocado" de Panagiotis Kanavos. Gracias de nuevo :)