Преобразование 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);
    }
}