es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Serializar cadena XML a objeto y a JSON

Tengo el siguiente formato de cadena XML donde la clave de propiedad es aleatoria y no se conoce, pero siempre empieza con un carácter alfanumérico.

<properties>
  <property key="EventId">3300</property>
  <property key="source">car</property>
  <property key="type">omega</property>
  <property key="a341414">any value</property>
  <property key="arandomstring_each_time_different">any value</property>
  ....
</properties>

¿Cómo lograr el siguiente formato?

{
   "properties":
   {
      "EventId": "3300",
      "source": "car",
      ...
   }
}

He probado algunas variaciones del siguiente código, pero sin éxito:

XDocument doc = XDocument.Parse(cadena); 
string jsonTexto = JsonConvert.SerializeXNode(doc);
var dinamico = JsonConvert.DeserializeObject<expandoobject>(jsonTexto);

Resultado:

json
{
"properties":{
"property":[
{
"@key":"EventId",
"#text":"3300"
},
{
"@key":"source",
"#text":"car"
},
...
]
}
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el formato JSON deseado, puedes utilizar LINQ to XML para iterar sobre los elementos XML y crear un diccionario de pares clave-valor, luego serializar el diccionario a JSON utilizando la biblioteca Json.NET de Newtonsoft. Aquí tienes un código de muestra:

    using System.Xml.Linq;
    using Newtonsoft.Json;
    
    // supongamos que xmlString es la cadena de XML de entrada
    
    // analiza la cadena de XML en un XElement
    var root = XElement.Parse(xmlString);
    
    // crea un diccionario para almacenar los pares clave-valor
    var dict = new Dictionary<string, string="">();
    
    // itera sobre los elementos 'property' y agrega sus valores al diccionario
    foreach (var prop in root.Elements("property"))
    {
        dict[prop.Attribute("key").Value] = prop.Value;
    }
    
    // serializa el diccionario a JSON utilizando Json.NET
    var json = JsonConvert.SerializeObject(new { properties = dict });
    
    // imprime la cadena JSON
    Console.WriteLine(json);
    

    Esto generará la siguiente cadena JSON:

    {
       "properties":{
          "EventId":"3300",
          "source":"car",
          "type":"omega",
          "a341414":"any value",
          "arandomstring_each_time_different":"any value"
       }
    }
    

    Ten en cuenta que las claves en el diccionario y en el objeto JSON resultante están en el mismo orden en que aparecen en el XML, pero esto no se garantiza ya que los elementos XML no tienen orden definido por naturaleza.</string,>

Comments are closed.