首页 > 解决方案 > 如何在 C# 中使用添加的自定义标签将 JSON 转换为 XML

问题描述

我有一些这种格式的示例 JSON:

{
    "id": "532-513jg-5ujkl-5jiklf",
    "externalGuid": "93804jlkfes",
    "tagNumber": "2KMA",
    "project": {
        "id": "532kg-fw13jg-553klal-5jiklf",
        "projectName": "Test",
        "projectId": "1"
    },
    "properties": [
        {
            "id": "jkl39-jkl39084-agd208-hh82a9",
            "name": "Weight",
            "value": "1000",
            "statusCode": {
                "name": "Accepted",
                "code": 1
            }
        },
        {
            "id": "jkl39-jkl384-123208-hh82a9",
            "name": "Length",
            "value": "10",
            "statusCode": {
                "name": "Not Accepted",
                "code": 3
            }
        }
    ]
}

我想将其转换为 XML,所以我执行以下操作: XmlDocument node = JsonConvert.DeserializeXmlNode(jsonString, "tag"); 这给了我以下 XML:

<tag>
  <id>532-513jg-5ujkl-5jiklf</id>
  <externalGuid>93804jlkfes</comosUID>
  <tagNumber>2KMA</tagNumber>
  <project>
    <id>532kg-fw13jg-553klal-5jiklf</id>
    <projectName>Test</projectName>
    <projectId>1</projectId>
  </project>
  <properties>
    <id>jkl39-jkl39084-agd208-hh82a9</id>
    <name>Weight</name>
    <value>1000</value>
    <statusCode>
      <name>Accepted</name>
      <code>1</code>
    </statusCode>
  <properties>
    <id>jkl39-jkl384-123208-hh82a9</id>
    <name>Length</name>
    <value>10</value>
    <statusCode>
      <name>Not Accepted</name>
      <code>3</code>
    </statusCode>
  </properties>
</tag>

这几乎是我想要的。然而,将要导入 XML 的系统需要一种稍微不同的格式。它希望每个属性都以<property>标签开头和结尾。所以属性数组看起来像这样:

<properties>
  <property>
    <id>jkl39-jkl39084-agd208-hh82a9</id>
    <name>Weight</name>
    <value>1000</value>
    <statusCode>
      <name>Accepted</name>
      <code>1</code>
    </statusCode>
  </property>
  <property>
    <id>jkl39-jkl384-123208-hh82a9</id>
    <name>Length</name>
    <value>10</value>
    <statusCode>
      <name>Not Accepted</name>
      <code>3</code>
    </statusCode>
  </property>
</properties>

如何使 XML 与此模板匹配?也就是说,将properties标签替换为property,并将所有标签包装propertyproperties父标签中。

标签: c#json.netxml

解决方案


要更改输入的格式,您应该首先将 JSON 反序列化为匹配模型,然后您可以使用 System.Xml.Linq 按顺序导出节点并构建任何您想要的结构。

Model model = JsonConvert.DeserializeObject<model>(jsonString);
var xml = new XElement("properties", 
               new XElement("property",
                  new XElement("id", model.Id),
                  new XElement("name", model.Name) /*and so on*/));

看起来要写很多东西,但实际上你可以用 XML 做任何你想做的事情。您可以准备方法来处理模型并对其进行调整,但这取决于您的要求。

您还可以创建另一个结构与 xml 文件结构相对应的模型,然后您必须使用原始节点中的数据填充该模型,但这看起来像是很多不必要的工作。我个人将使用 System.Xml.Linq 来完成此类任务。


推荐阅读