【问题标题】:Convert XML to Json Array when only one object只有一个对象时将 XML 转换为 Json 数组
【发布时间】:2014-12-24 02:57:46
【问题描述】:

我目前正在使用 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 来返回一组项目,无论是否有一个或多个。

有没有办法让它认为它是一个数组,或者有人可以建议另一种方法吗?

【问题讨论】:

  • 对不起,你想成为一个数组,不确定我是否正确地回答了这个问题
  • 对不起,我已经编辑过,希望能更清楚。我需要一组物品。
  • @DJkraze 他已经完成了他所需要的转换,需要它一种不同的格式
  • @DJKRAZE,您发送的链接正是我正在做的。我只是需要不同的东西。除非我完全没有抓住重点,否则请解释或善意收回您的反对票。
  • 好的,您可以执行以下操作吗,因为我无法从您的问题XmlNote myXmlNode = JsonConvert.DeserializeXmlNode(yourJsonString); // or .DeserilizeXmlNode(myJsonString, "root"); // if yourJsonString does not have a root string jsonString = JsonConvert.SerializeXmlNode(myXmlNode); 中判断哪种格式正确或不正确;

标签: c# .net xml json json.net


【解决方案1】:

阅读此documentation about Serialize Xml Node

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

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

DEMO

【讨论】:

  • 太棒了!您是否碰巧知道如何使用 XElement 生成它,因为它不喜欢“:”?
  • 谢谢我现在明白了。在下面我将如何使用 XElement 而不是 xmltextwritera 和 XDocument 进行操作
  • 一旦 XML 文档已经在内存中,这有点困难。但是,可以使用 XmlNode.Attributes.Append(XMLAttribute) 方法直接将命名空间添加到节点。你会得到: 这也可以工作。
  • @meda 在将 xml 转换为 json 然后再转换为 xml 再转换为 json 时,您如何保持 json:Array 属性?问题:stackoverflow.com/q/48763666/7392294
【解决方案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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-21
        • 2018-04-16
        • 1970-01-01
        • 2019-07-29
        • 2016-06-06
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        相关资源
        最近更新 更多