Saltar al contenido

¿Cómo convertir JSON a XML o XML a JSON?

Solución:

Si. Usando la clase JsonConvert que contiene métodos auxiliares para este propósito preciso:

// To convert an XML node contained in string xml into a JSON string   
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

// To convert JSON text contained in string json into an XML node
XmlDocument doc = JsonConvert.DeserializeXmlNode(json);

Documentación aquí: Conversión entre JSON y XML con Json.NET

Sí, puede hacerlo (yo lo hago) pero tenga en cuenta algunas paradojas al convertir y maneje adecuadamente. No puede ajustarse automáticamente a todas las posibilidades de la interfaz, y hay un soporte integrado limitado para controlar la conversión; muchas estructuras y valores JSON no se pueden convertir automáticamente en ambos sentidos. Tenga en cuenta que estoy usando la configuración predeterminada con la biblioteca Newtonsoft JSON y la biblioteca MS XML, por lo que su kilometraje puede variar:

XML -> JSON

  1. Todos los datos se convierten en datos de cadena (por ejemplo, siempre obtendrá “falso” no falso o “0” no 0) Obviamente, JavaScript los trata de manera diferente en ciertos casos.
  2. Los elementos secundarios pueden convertirse en objetos anidados {} O matriz anidada [ {} {} ...] dependiendo de si solo hay uno o más de un elemento hijo XML. Los consumirías de manera diferente en JavaScript, etc. Diferentes ejemplos de XML que se ajustan al mismo esquema pueden producir estructuras JSON realmente diferentes de esta manera. Puedes agregar el atributo json: Array = ‘verdadero’ a su elemento para solucionar esto en algunos casos (pero no necesariamente en todos).
  3. Su XML debe ser equitativamente bien formado, he notado que no necesita ajustarse perfectamente al estándar W3C, pero 1. debe tener un elemento raíz y 2. no puede comenzar los nombres de los elementos con números son dos de los estándares XML obligatorios que he encontrado al usar Bibliotecas Newtonsoft y MS.
  4. En versiones anteriores, los elementos en blanco no se convierten a JSON. Son ignorados. Un elemento en blanco no se convierte “elemento”: nulo

Una nueva actualización cambia la forma en que se puede manejar nulo (gracias a Jon Story por señalarlo): https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm

JSON -> XML

  1. Necesita un objeto de nivel superior que se convierta en un elemento XML raíz o el analizador fallará.
  2. Los nombres de sus objetos no pueden comenzar con un número, ya que no se pueden convertir en elementos (XML es técnicamente incluso más estricto que esto) pero puedo “salirse con la suya” rompiendo algunas de las otras reglas de nomenclatura de elementos.

Siéntase libre de mencionar cualquier otro problema que haya notado. He desarrollado mis propias rutinas personalizadas para preparar y limpiar las cuerdas a medida que las convierto de un lado a otro. Su situación puede o no requerir preparación / limpieza. Como menciona StaxMan, su situación puede requerir que convierta entre objetos … esto podría implicar interfaces apropiadas y un montón de declaraciones de casos / etc. para manejar las advertencias que mencioné anteriormente.

También puede hacer estas conversiones con .NET Framework:

JSON a XML: mediante el uso de System.Runtime.Serialization.Json

var xml = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(
    Encoding.ASCII.GetBytes(jsonString), new XmlDictionaryReaderQuotas()));

XML a JSON: mediante System.Web.Script.Serialization

var json = new JavaScriptSerializer().Serialize(GetXmlData(XElement.Parse(xmlString)));

private static Dictionary<string, object> GetXmlData(XElement xml)
{
    var attr = xml.Attributes().ToDictionary(d => d.Name.LocalName, d => (object)d.Value);
    if (xml.HasElements) attr.Add("_value", xml.Elements().Select(e => GetXmlData(e)));
    else if (!xml.IsEmpty) attr.Add("_value", xml.Value);

    return new Dictionary<string, object> { { xml.Name.LocalName, attr } };
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *