C# 当只有一个对象时,将XML转换为Json数组

C# 当只有一个对象时,将XML转换为Json数组,c#,.net,xml,json,json.net,C#,.net,Xml,Json,Json.net,我目前正在使用Newtonsoft将一些xml转换为json,以从RestExtension返回 我的xml格式为 <Items> <Item> <Name>name</Name> <Detail>detail</Detail> </Item> <Item> <Name>name</Name> <Detail>de

我目前正在使用Newtonsoft将一些xml转换为json,以从RestExtension返回

我的xml格式为

<Items>
  <Item>
    <Name>name</Name>
    <Detail>detail</Detail>    
  </Item>
  <Item>
    <Name>name</Name>
    <Detail>detail</Detail>    
  </Item>
</Items>
如果有多个项目,则此项工作正常

我得到了这个——json中的一个项目数组(这就是我所需要的):

但当只有一个时,可以理解它会像这样转换(不是数组):

正在阅读本文的我的应用程序开发人员需要json返回一个项目数组,无论是否有一个或多个项目

有没有一种方法可以诱使它认为它是一个数组,或者有人可以提出另一种方法来实现这一点?

阅读此文

您可以通过这种方式强制JSON数组

var xml = @"<Items xmlns:json='http://james.newtonking.com/projects/json' >
             <Item json:Array='true'>
                <Name>name</Name>
                 <Detail>detail</Detail>    
            </Item>
            </Items>";
var xml=@”
名称
细节
";

如果它对任何人都有帮助,请进一步了解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);
-可用于将此类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());
免责声明:我是此库的作者。

公共类WSDLReport
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);
    }
}
{ 私人IEnumerable_文件; 私有文档(动态文档) { var type=documents.GetType(); if(type==typeof(JObject)) _文档=新列表(){((JObject)文档).ToObject()}; else if(type==typeof(JArray)) _document=((JArray)documents).ToObject(); 其他的 _文件=新列表(); } 私有动态GetDocuments()=>\u文档; [JsonProperty(“dokumentyEzla”)] 公共动态文档 { get=>GetDocuments(); set=>SetDocuments(值); } }
抱歉,你想成为一个数组吗?我不确定我是否正确地回答了这个问题。抱歉,我已经编辑了,希望能让问题更清楚。我需要一系列物品。@DJkraze他已经完成了转换,他只是需要一个不同的东西format@DJKRAZE,你发送的链接正是我正在做的。我只是需要不同的方式。除非我完全没有抓住重点,否则请解释一下,或是善意地收回你的反对票。好的,你能做如下的事情吗?因为我无法从你的问题中分辨出哪种格式是正确的或不正确的
XmlNote myXmlNode=JsonConvert.DeserializeXmlNode(yourJsonString);//或.DeserilizeXmlNode(myJsonString,“root”);//如果您的jsonString没有根
string jsonString=JsonConvert.SerializeXmlNode(myXmlNode);太好了!您是否知道如何使用XElement生成它,因为它不喜欢“:”?谢谢,我现在明白了。我在下面贴了一篇帖子,告诉您如何使用XElement而不是xmltextwritera和XDocument。一旦XML文档已经存储在内存中,这就有点困难了。但是,可以使用XmlNode.Attributes.Append(XMLAttribute)方法将名称空间直接添加到节点。您将得到:也可以。@meda在将xml转换为json,然后再转换为xml,再转换回json时,如何保持json:Array属性?问题:
 XmlDocument doc = new XmlDocument();
            doc.LoadXml(items.ToString());
            var converted JsonConvert.SerializeXmlNode(doc);
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"
  }
 ]
}
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);
    }
}