Tengo esta cadena JSON:
string jsonString = "{ "users":[ {"name":"John", "code":"white", "job":"actor"}, {"name":"Oliver", "code":"black", "job": "seller"} ] }"luego deserializarlo usando:
JsonElement je = JsonDocument.Parse(jsonString).RootElement; JsonElement.ArrayEnumerator users = je.GetProperty("users").EnumerateArray();con system.text.json, ¿cómo puedo obtener primero JsonElement cuyo código es "negro"? Me refiero a sin bucles (foreach, ...).
con newtonsoft.json simplemente podría hacer esto:
dynamic json = JsonConvert.DeserializeObject(jsonString); dynamic user = json.SelectToken("[?(@.code == 'black')]"); string name = user["name"], job = user["job"];¿Cómo puedo obtener el primer JsonElement cuyo código es "negro"?
Crearía clases que representen su estructura json y luego deserializaría esas clases.
Puedes crear tus clases como tales:
using System; using System.Linq; using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; public class People { [JsonPropertyName("users")] public List<User> Users { get; set; } } public class User { [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("code")] public string Code { get; set; } [JsonPropertyName("job")] public string Job { get; set; } }Luego para deserializar:
string jsonString = "{\"users\":[{\"name\":\"John\",\"code\":\"white\",\"job\":\"actor\"},{\"name\":\"Oliver\",\"code\":\"black\",\"job\":\"seller\"}]}"; People people = JsonSerializer.Deserialize<People>(jsonString); Ahora puede obtener el primer objeto User donde code es negro:
var usr = people.Users.Where(u => u.Code == "black").FirstOrDefault();Aquí está el ejemplo que puede ejecutar.
ACTUALIZAR POR COMENTARIO
es JSON dinámico
Puede deserializar su json a JsonElement y luego intentar obtener las propiedades que desea.
var people = JsonSerializer.Deserialize<JsonElement>(jsonString); if(people is JsonElement je && je.TryGetProperty("users", out je)){ // obj will be JsonElement if match is found var obj = je.EnumerateArray().Where(je => je.TryGetProperty("code", out je) && je.GetString() == "black").FirstOrDefault(); // Get what you need var name = obj.TryGetProperty("name", out JsonElement eleName) ? eleName.GetString() : "No name"; var job = obj.TryGetProperty("job", out JsonElement eleJob) ? eleJob.GetString() : "No job"; Console.WriteLine(string.Format("{0}\n{1}", name, job)); }*Puedes probar este código allí