【问题标题】:Converting from JSON to XML using c#使用 C# 从 JSON 转换为 XML
【发布时间】:2018-08-30 13:54:02
【问题描述】:

我有一种将 JSON 转换为 xml 的有线要求。 我们有一个返回 JSON 响应的 API,如下所示。

{
   "status":"Error",
   "errorMessages":{
      "1001":"Schema validation Error"
   }
}

我们想使用 c# 将此 JSON 转换为 XML,如下所示

<root>
  <status>ERROR</status>
  <errorMessages>
    <ErrorCode>1001</ErrorCode>
    <ErrorDescription>Schema validation Error</ErrorDescription>    
  </errorMessages>
</root>

API 团队非常不愿意改变生成 JSON 的方式。所以我必须想办法把这个json转换成XML。

当我尝试转换时出现以下错误

XmlDocument doc = JsonConvert.DeserializeXmlNode(json);

"JSON 根对象具有多个属性。根对象必须具有单个属性才能创建有效的 XML 文档。考虑指定 DeserializeRootElementName。路径错误消息

提前感谢您的帮助。 :)

【问题讨论】:

  • 当我尝试运行 deserializeXmlNode 方法时,我收到以下错误XmlDocument doc = JsonConvert.DeserializeXmlNode(json); `当我尝试转换“JSON 根对象具有多个属性时,我收到以下错误。根对象必须具有单个属性以创建有效的 XML 文档。考虑指定 DeserializeRootElementName。路径 'errorMessages `
  • 您需要为此 JSON 编写一个自定义转换器,因为 1)它没有根节点(如错误所示)和 2)它具有以数字开头的属性(这将是无效的 XML 元素名称)。没有直接的转化路径。

标签: c# json xml-parsing jsonparser


【解决方案1】:

起初,我几乎不建议您的 API 团队提供有效的 JSON 对象。否则,您将不得不编写一个转换器来完成这项工作。转换器可能如下所示:

using System.Collections.Generic;

namespace Json
{
    using System.IO;
    using System.Xml.Serialization;

    using Newtonsoft.Json.Linq;

    class Program
    {
        static void Main(string[] args)
        {
            var converter = new Converter();
            converter.Convert();
        }
    }

    class Converter
    {
        public void Convert()
        {
            //  your JSON string goes here
            var jsonString = @"{""status"":""Error"",""errorMessages"":{ ""1001"":""Schema validation Error"", ""1953"":""Another error""}}";

            // deconstruct the JSON
            var jObject = JObject.Parse(jsonString);
            var root = new Root { Status = jObject["status"].ToString(), ErrorMessages = new List<ErrorMessage>() };
            foreach (var errorMessageJsonObject in jObject["errorMessages"])
            {
                var jProperty = (JProperty)errorMessageJsonObject;
                var errorCode = System.Convert.ToInt16(jProperty.Name);
                var errorDescription = jProperty.Value.ToString();
                var errorMessage = new ErrorMessage() { ErrorCode = errorCode, ErrorDescription = errorDescription};

                root.ErrorMessages.Add(errorMessage);
            }

            // serialize as XML
            var xmlSerializer = new XmlSerializer(typeof(Root));
            string xml;
            using (StringWriter textWriter = new StringWriter())
            {
                xmlSerializer.Serialize(textWriter, root);
                xml = textWriter.ToString();
            }
        }
    }

    public class Root
    {
        public string Status;

        public List<ErrorMessage> ErrorMessages;
    }

    public class ErrorMessage
    {
        public int ErrorCode;

        public string ErrorDescription;
    }
}

这样,您将读取 JSON,将其解构为适当的对象并将其序列化为 XML。

【讨论】:

  • 非常感谢@mu88 这有效。 :) 我们已经要求 API 团队对其进行更改,但我们不确定是否会这样做..
  • 太棒了!如果您喜欢这篇文章,请给它投票和/或将其标记为答案。
【解决方案2】:

使用包含辅助方法的 JsonConvert 类来实现此精确目的:

// 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);

完成的文档:Here

【讨论】:

  • 嗨,卡洛斯,感谢您的回复。当我尝试转换“JSON 根对象具有多个属性。根对象必须具有单个属性才能创建有效的 XML 文档。考虑指定 DeserializeRootElementName。路径'errorMessages'”时,我收到以下错误。
  • 嗨,Abhi pm,如果可能的话,试试吧。 link
【解决方案3】:

如果您使用的是 asp.net web api。它已经可以返回 xml 响应,只需添加一个接受标头,如

Accept: application/xml

【讨论】:

  • 当我添加上面的标题时,它会失败,因为 xml 元素不能以整数开头。 &lt;root&gt; &lt;status&gt;ERROR&lt;/status&gt; &lt;errorMessages&gt; &lt;1274&gt;Schema validation Error&lt;/1274&gt; &lt;/errorMessages&gt; &lt;/root&gt;
  • 我正在 biztalk 服务器中使用此服务。所以我需要编写一个自定义的 c# 组件来进行这种转换。
【解决方案4】:

来自https://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htm的文档

string json = @"{
  '?xml': {
    '@version': '1.0',
    '@standalone': 'no'
  },
  'root': {
    'person': [
      {
        '@id': '1',
        'name': 'Alan',
        'url': 'http://www.google.com'
      },
      {
        '@id': '2',
        'name': 'Louis',
        'url': 'http://www.yahoo.com'
      }
    ]
  }
}";

XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2012-08-15
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多