Преобразование XML в Json Array, когда только один объект
В настоящее время я использую Newtonsoft для преобразования некоторого xml в json для возврата из RestExtension.
Мой xml находится в форме
<Items>
<Item>
<Name>name</Name>
<Detail>detail</Detail>
</Item>
<Item>
<Name>name</Name>
<Detail>detail</Detail>
</Item>
</Items>
Я конвертирую это в json, используя
JsonConvert.SerializeXmlNode(xmldocument);
Это работает отлично, если имеется более одного элемента.
Я получаю это - массив элементов в json (это то, что мне нужно):
{"Items":{"Item":[{"Name":"name","Detail":"detail"},{"Name":"name","Detail":"detail"}]}}
Но когда есть только один, он вполне понятно преобразуется как это (а не массив):
{"Items":{"Item":{"Name":"name","Detail":"detail"}}}
Мой разработчик приложений, который читает это, нуждается в json для возврата массива элементов независимо от того, есть ли один или несколько.
Есть ли способ обмануть его, чтобы подумать об этом массиве или кто-то может предложить другой способ сделать это?
Ответы
Ответ 1
Прочитайте эту документацию о Serialize Xml Node
Вы можете заставить JSON Array таким образом
var xml = @"<Items xmlns:json='http://james.newtonking.com/projects/json' >
<Item json:Array='true'>
<Name>name</Name>
<Detail>detail</Detail>
</Item>
</Items>";
DEMO
Ответ 2
В случае, если это помогает кому-то, далее, чтобы ответить meda.
Здесь, как вы делаете эту работу с XElement, а не с xmlTextWriter и XDocument
XNamespace ns = "http://james.newtonking.com/projects/json";
var items = new XElement("items",new XAttribute(XNamespace.Xmlns+"json",ns));
items.Add(new XElement("item",new XAttribute(ns+"Array",true),
new XElement("name", "name"),
new XElement("Detail", "detail")));
чтобы преобразовать его
XmlDocument doc = new XmlDocument();
doc.LoadXml(items.ToString());
var converted JsonConvert.SerializeXmlNode(doc);
Ответ 3
Cinchoo ETL - библиотека с открытым исходным кодом, доступная для преобразования такого xml в ожидаемый формат json
string xml = @"<Items>
<Item>
<Name>name</Name>
<Detail>detail</Detail>
</Item>
</Items>";
StringBuilder sb = new StringBuilder();
using (var p = ChoXmlReader.LoadText(xml).WithXPath("/"))
{
using (var w = new ChoJSONWriter(sb)
.Configure(c => c.SupportMultipleContent = true)
)
w.Write(p);
}
Console.WriteLine(sb.ToString());
Выход:
{
"Items": [
{
"Name": "name",
"Detail": "detail"
}
]
}
Отказ от ответственности: я являюсь автором этой библиотеки.
Ответ 4
public class WSDLReport
{
private IEnumerable<WSDLDocument> _document;
private void SetDocuments(dynamic documents)
{
var type = documents.GetType();
if (type == typeof(JObject))
_document = new List<WSDLDocument>() { ((JObject)documents).ToObject<WSDLDocument>() };
else if (type == typeof(JArray))
_document = ((JArray)documents).ToObject<IEnumerable<WSDLDocument>>();
else
_document = new List<WSDLDocument>();
}
private dynamic GetDocuments() => _document;
[JsonProperty("dokumentyEzla")]
public dynamic Document
{
get => GetDocuments();
set => SetDocuments(value);
}
}