通过在 c 中保留没有模型的数据类型,将 XML 转换为 JSON#

Convert the XML to JSON by preserving the data types without model in c#

提问人:Manil 提问时间:6/7/2023 最后编辑:CharliefaceManil 更新时间:6/7/2023 访问量:318

问:

我正在尝试在不更改数据类型的情况下将 XML 转换为 JSON,但它总是返回字符串值。我尝试了不同的方法来使用适当的数据类型进行转换。 下面是我的源 XML 和预期的 JSON

<Employee >
  <Name>John</Name>
  <Age>18</Age>
  <IsContractor>true</IsContractor>
  <Salary>5555.66</Salary>
</Employee>

预期成果

 "Employee": {
      "Name": "John",
      "Age": 18,
      "IsContractor": true,
      "Salary": 5555.66
    }

我尝试了不同的方法,但没有运气

 string xml = @"<Employee>
                            <Name>John</Name>
                            <Age json:Type='Integer'>18</Age>
                            <IsContractor json:Type='Boolean'>true</IsContractor>
                            <Salary json:Type='Decimal'>5555.66</Salary>
                        </Employee>";
      
        var doc = new XmlDocument();
        doc.LoadXml(xml);
        var result = JsonConvert.SerializeXmlNode(doc);

另外,我尝试添加这样的数据类型

          var xml = @"<Employee  xmlns:m=""urn:informatica:ae:xquery:json2xml:meta-data"">
                    <Name>John</Name>
                    <Age m:type=""xs:double"">18</Age>
                    <IsContractor m:type=""xs:boolean"">true</IsContractor>
                     </Employee>";
        var doc = new XmlDocument();
        doc.LoadXml(xml);
        var result1 = JsonConvert.SerializeXmlNode(doc);

但是这两种方式都将所有值转换为字符串。

C# JSON XML 解析 json.net

评论


答:

-1赞 Chris Starkey 6/7/2023 #1

您可以使用利用 Newtonsoft.Json 将 XML 转换为 JSON 的解决方法,然后再次分析 JSON 以将字符串值转换为适当的数据类型。

string xml = @"<Employee>
                <Name>John</Name>
                <Age>18</Age>
                <IsContractor>true</IsContractor>
                <Salary>5555.66</Salary>
                </Employee>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

string jsonText = JsonConvert.SerializeXmlNode(doc);
JObject json = JObject.Parse(jsonText);

// parse values to appropriate data types
json["Employee"]["Age"] = int.Parse(json["Employee"]["Age"].ToString());
json["Employee"]["IsContractor"] = bool.Parse(json["Employee"]["IsContractor"].ToString());
json["Employee"]["Salary"] = decimal.Parse(json["Employee"]["Salary"].ToString());

Console.WriteLine(json.ToString());
1赞 Serge 6/7/2023 #2

这段代码对我有用。例如,如果您有嵌套对象,则只需更改迭代算法即可

var xml = @"
<Employee >
  <Name>John</Name>
  <Age type='System.Int32'>18</Age>
  <IsContractor type='System.Boolean'>true</IsContractor>
  <Salary type='System.Double'>5555.66</Salary>
</Employee>";

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(xml);

    string json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None, false);
    var jObj = JObject.Parse(json);

    foreach (JObject element in jObj.Properties().First())
    {
        foreach (var prop in element.Properties())
        {
            if (prop.Value.Type == JTokenType.Object)
                prop.Value = ConvertToType((JObject)prop.Value);
        }
    }

    json = jObj.ToString();

public JValue ConvertToType(JObject jObj)
{
    var val = Convert.ChangeType(jObj["#text"], Type.GetType((string)jObj["@type"]));
    return new JValue(val);
}

输出

{
  "Employee": {
    "Name": "John",
    "Age": 18,
    "IsContractor": true,
    "Salary": 5555.66
  }
}

评论

0赞 Manil 6/7/2023
这也对我有用。如果我们解析具有多种不同数据类型的大型 XML,这是否会导致任何性能问题