我有一种将 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。路径 errorMessages
提前感谢您的帮助。 :)
首先,我几乎不建议您的 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。
如果您使用的是 asp.net web api。它已经可以返回 xml 响应,只需添加一个接受标头,如
Accept: application/xml
来自 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);
使用 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);
完整的文档:这里
private string SerializeToXml<T>(T data)
{
var xmlSerializer = new XmlSerializer(typeof(T));
StringBuilder xmlContent = new StringBuilder();
xmlContent.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
var settings = new XmlWriterSettings
{
Encoding = Encoding.UTF8,
Indent = true,
OmitXmlDeclaration = true
};
using (StringWriter stringWriter = new StringWriter(xmlContent))
{
using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings))
{
xmlSerializer.Serialize(xmlWriter, data);
}
}
return xmlContent.ToString();
}
[HttpGet]
public async Task<IActionResult> Get()
{
try
{
var queue = await _freeSwitch.agents.ToListAsync();
var response = SerializeToXml(queue);
return Content(response, "application/xml", Encoding.UTF8);
}
catch (Exception ex)
{
_logger.LogError(ex, "An error occurred while fetching queues");
return Problem(detail: ex.Message, statusCode: 500);
}
}