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

p3rjfoxz  于 2023-06-07  发布在  C#
关注(0)|答案(2)|浏览(228)

我试图在不改变数据类型的情况下将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);

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

mklgxw1f

mklgxw1f1#

这个代码为我工作。例如,如果你有嵌套的对象,你只需要改变一个迭代算法

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
  }
}
llmtgqce

llmtgqce2#

您可以使用一种变通方法,即利用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());

相关问题