【问题标题】:Convert XML to JSon to c# object将 XML 转换为 JSON 到 c# 对象
【发布时间】:2018-07-05 18:35:27
【问题描述】:

作为动态文档处理器应用程序的一部分,我们必须将数千个文档从 XML 迁移到 Json。这是我的方法。

我有这个 Xml

<?xml version="1.0"?>
    <syscur_historial_schema>
        <strtipoobj>OM_SECCION</strtipoobj>
        <strnombreobj>_1_Seccion_IDENTIFICACION_DEL_PACIENTE</strnombreobj>
        <numobj>0.00</numobj>
        <txtpropsobj/>
        <txtprostit><![CDATA[BackColor = 14171687,BorderStyle = 0,FontBold = .F.,FontItalic = .F.,FontName = "Tahoma",FontSize = 9,FontUnderline = .F.,ForeColor = 0,AutoSize = .F.,BackStyle = 1,LineColor = 14171687, TitleWidth=100, CAPTION="IDENTIFICACION DEL PACIENTE"]]>
        </txtprostit>
        <strencabezado>IDENTIFICACION DEL PACIENTE</strencabezado>
    </syscur_historial_schema>

我将其转换为 JSon:

然后我需要将那个 JSon 反序列化到这个 c# 类中:

public class syscur_historial_schema
{
    public string strtipoobj { get; set; }
    public string strnombreobj { get; set; }
    public string numobj { get; set; }
    public string txtpropsobj { get; set; }
    public string txtprostit { get; set; }
    public string strencabezado { get; set; }
}

这是我的转换器:

public class ConvertXmlToJson
{
    /// <summary>
    /// Convierte un archivo con formato XML en fornato JSon 
    /// usando JsonConvert.SerializeXmlNode(doc)
    /// </summary>
    /// <param name="xmlPath"></param>
    /// <returns></returns>
    public static string XmlToJsonSerializeXmlNode<T>(string xmlPath, string nodeName, bool cleanString)
    {
        string justPath = Path.GetDirectoryName(xmlPath);
        string json = Path.Combine(justPath, $"{Path.GetFileNameWithoutExtension(xmlPath)}.json");
        XmlDocument doc = new XmlDocument();

        if (cleanString)
            doc.LoadXml(CleanRepeatedSpaces(File.ReadAllText(xmlPath)));
        else
            doc.LoadXml(File.ReadAllText(xmlPath));

        XmlNodeList nodes = GetNode(doc, nodeName);
        List<T> lista = new List<T>();
        foreach (XmlNode node in nodes)
        {
            string jSonNode = JsonConvert.SerializeXmlNode(node);
            T obj = JsonConvert.DeserializeObject<T>(jSonNode);
            lista.Add(obj);
        }
        File.WriteAllText(json, JsonConvert.SerializeObject(lista));
        return json;
    }

    public static XmlNodeList GetNode(XmlDocument doc, string nodeName)
    {
        XmlNodeList nodes = doc.GetElementsByTagName(nodeName);
        return nodes;
    }
}    

还有这个测试方法

[TestMethod]
public void Tools_ConvertXmlToJson_Tests()
{
    string path = "D:\\MyXmlPath\\";
    string xml = Path.Combine(path, "MyXmlFile.hist");
    string jsonFile = ConvertXmlToJson.XmlToJsonSerializeXmlNode<syscur_historial_schema>(xml, "syscur_historial_schema",true);
    Assert.AreEqual(true, File.Exists(jsonFile));
    List<syscur_historial_schema> jsonObject = JsonConvert.DeserializeObject<List<syscur_historial_schema>>(File.ReadAllText(jsonFile));
}

现在我的问题是我的反序列化对象总是在每个属性上返回 null,我认为问题是 CDATA 节点。

问题

1-我做错了什么?

2- 如何将 xml CDATA 转换为 Json 字符串?

【问题讨论】:

  • 为什么要从 XML 到 JSON,然后再到 C# 对象?为什么不直接将 XML 反序列化为一个类?它可能会很好地处理 CData 部分。
  • @JLRishe 作为迁移计划的一部分,我必须将大量文件从 xml 转换为 json。而且我的 XML 模式非常古老。我不需要转换完整的 xml。只是其中的一些节点。

标签: c# json xml


【解决方案1】:

让你的 syscur_historial_schema 类像这样序列化:

[Serializeable]     
public class syscur_historial_schema
{
 public string strtipoobj { get; set; }
 public string strnombreobj { get; set; }
 public string numobj { get; set; }
 public string txtpropsobj { get; set; }
 public string txtprostit { get; set; }
 public string strencabezado { get; set; }
}

然后像这样将xml反序列化到类中:

XmlSerializer serializer = new XmlSerializer(typeof(syscur_historial_schema));

StreamReader reader = new StreamReader(xmlPath);
var schema = (syscur_historial_schema)serializer.Deserialize(reader);
reader.Close();

然后像这样将schema转换成json:

 string json = JsonConverter.SerializeObject(schema);

在将 xml 字符串转换为类对象之前,您不必将其转换为 xml 文档。直接将xml字符串直接反序列化成类对象。

【讨论】:

  • 感谢您的方法。 Serializeable 属性的 NS 是什么?
  • 这是一个属性...没有命名空间。在类声明上方,只需开始输入“[”,它就会与智能感知一起出现。
  • @dickrichie 嗯...它是technicallySystem 命名空间中。
  • @dickrichie 是的。你有一个 [Serializeable] 的错字必须是 [Serializable]
  • 哈!我是一个糟糕的拼写。感谢大神们的智能感知和谷歌!
猜你喜欢
  • 2023-03-04
  • 2018-04-16
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多