query property newtonsoft jtoken jobject jarray example c# xml regex xpath json.net

c# - property - Json.net: ¿JObject.SelectToken puede hacer lo mismo que XPath? En caso afirmativo, ¿cuál es la sintaxis?



newtonsoft json get property value (2)

¿JObject.SelectToken puede hacer lo mismo que XPath?

¿Cuál es la sintaxis del parámetro Path de la función SelectToken?

Creo que solo es compatible con la ruta de cadena a un único token como "branches[0].employees[0].name"

¿Cómo selecciono todo el EmpId de empleados donde Nombre = "Nombre1"?

No estoy seguro de que SelectToken pueda hacer eso y las restricciones de su pregunta descartan las soluciones más comunes.

No pude encontrar mucha documentación (básicamente sintaxis) con respecto a la cadena de ruta que se pasará a la función SelectToken.

Alguna documentación aquí :

La ruta se compone de nombres de propiedad e índices de matriz separados por puntos. Los índices de matriz pueden usar corchetes cuadrados o redondos.

La respuesta a la consulta publicada en 2009 fue utilizar una nueva característica JObject.SelectToken que se supone que entrega XPath como funcionalidad. Ahora estoy usando JSON.NET 4.5 R11 y el método SelectToken está disponible.

Pero no pude encontrar mucha documentación (básicamente sintaxis) con respecto a la cadena de ruta que se SelectToken función SelectToken .

El siguiente código produce una cadena Json y en la que me gustaría ejecutar un método similar a Xpath (es decir, que sepa SelectToken )

IList branches = new ArrayList(); IList employees = new ArrayList(); employees.Add(new { EmpId = 1, Name = "Name1" }); employees.Add(new { EmpId = 2, Name = "Name2" }); employees.Add(new { EmpId = 3, Name = "Name3" }); IList employees2 = new ArrayList(); employees2.Add(new { EmpId = 4, Name = "Name1" }); employees2.Add(new { EmpId = 5, Name = "Name5" }); branches.Add(new { BranchName = "Branch1", Employees = employees }); branches.Add(new { BranchName = "Branch2", Employees = employees }); string json = JsonConvert.SerializeObject(branches); var branchesDeserialised = JsonConvert.DeserializeAnonymousType(json, new[] { new { BranchName = "", Employees = new[] { new { EmpId = 0, Name = "" } } } }); JArray ja = JArray.Parse(json); var AllName1Tokens = ja.SelectToken(@"..Name=""Name1"""); //Get all names that are having Name = "Name1" irrespective of branch

Como no tengo los binarios de las clases y la estructura de la cadena Json es tan grande que será difícil de usar dinámico. Entonces, usar LINQ en los objetos después de la deserialización no es posible. No quiero convertir la cadena Json a XML o algún otro formato para hacer la selección. Además, no quiero escribir código para analizarlo.

¿Cuál es la sintaxis del parámetro Path de la función SelectToken ? ¿Cómo selecciono todo el EmpId de employees donde Name=”Name1” ?

Edit1 : ¿Es posible obtener el resultado utilizando JObject.Select (consulta LINQ) en cadena JSON (no en el objeto real) en caso de que SelectToken no sea capaz de hacerlo? ¿Qué hay de la expresión regular?


Del autor de JSON.NET:

Desde Json.NET 6.0 suplanta SelectToken con soporte completo para JSONPath, un lenguaje de consulta XPath para JSON.

JObject o = JObject.Parse(@"{ ""Manufacturers"": [ { ""Name"": ""Acme Co"", ""Products"": [ { ""Name"": ""Anvil"", ""Price"": 50 } ] }, { ""Name"": ""Contoso"", ""Products"": [ { ""Name"": ""Elbow Grease"", ""Price"": 99.95 }, { ""Name"": ""Headlight Fluid"", ""Price"": 4 } ] } ] }"); // manufacturer with the name ''Acme Co'' var acme = o.SelectToken("$.Manufacturers[?(@.Name == ''Acme Co'')]");

Más detalles en la publicación de blog