c# - 没有数组名称的XML到Json c#

标签 c# json xml json.net xml-to-json

我有以下 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <UserData>
      <User_Email>cynthia48@example.com</User_Email>
      <User_Name>Louis Hebert</User_Name>
      <User_State>South Dakota</User_State>
      <id>item1</id>
   </UserData>
   <UserData>
      <User_Email>brian52@example.com</User_Email>
      <User_Name>David Lewis</User_Name>
      <User_State>Connecticut</User_State>
      <id>item2</id>
   </UserData>
</root>

转换成json后的结果是这样的

{
  "UserData": [
    {
      "User_Email": "cynthia48@example.com",
      "User_Name": "Louis Hebert",
      "User_State": "South Dakota",
      "id": "item1"
    },
    {
      "User_Email": "brian52@example.com",
      "User_Name": "David Lewis",
      "User_State": "Connecticut",
      "id": "item2"
    }
    ]
}

我正在使用的 C# 代码

XmlDocument xmldoc = new XmlDocument();
            string xml1 = @"D:\Visual_Codes\Xml_Files\Data.xml";
            xmldoc.Load(xml1);
            xmldoc.RemoveChild(xmldoc.FirstChild);
            string js = JsonConvert.SerializeXmlNode(xmldoc, Newtonsoft.Json.Formatting.Indented, true);

要求的输出

[
        {
          "User_Email": "cynthia48@example.com",
          "User_Name": "Louis Hebert",
          "User_State": "South Dakota",
          "id": "item1"
        },
        {
          "User_Email": "brian52@example.com",
          "User_Name": "David Lewis",
          "User_State": "Connecticut",
          "id": "item2"
        }
        ]

总结问题 xml转json后需要一个没有数组名的json文件

最佳答案

JsonConvert.SerializeXmlNode()永远不会返回一个数组作为根 JSON 容器,因为如 Converting between JSON and XML 中所述,由于 XML 没有数组的概念,Json.NET 将重复的同名 XML 元素映射到 JSON 数组。因此,您想要的 JSON 只能从具有重复根元素的 XML 创建,如下所示:

<UserData>
   <User_Email>cynthia48@example.com</User_Email>
   <User_Name>Louis Hebert</User_Name>
   <User_State>South Dakota</User_State>
   <id>item1</id>
</UserData>
<UserData>
   <User_Email>brian52@example.com</User_Email>
   <User_Name>David Lewis</User_Name>
   <User_State>Connecticut</User_State>
   <id>item2</id>
</UserData>

但是,作为一个格式良好的 XML 文档必须有且只有一个 root element , 任何格式正确的 XML 文档都无法进行这种转换。

相反,您需要对 JSON 进行后处理以获得所需的 JSON 数组。这可以按如下方式完成。首先,创建以下扩展方法以将 XmlNode 直接转换为 JToken:

public static partial class JsonExtensions
{
    public static JToken ToJToken(this XmlNode node, bool omitRootObject = false, string deserializeRootElementName = null, bool writeArrayAttribute = false) =>
        JToken.FromObject(node, JsonSerializer.CreateDefault(
            new JsonSerializerSettings { Converters = { new XmlNodeConverter { OmitRootObject = omitRootObject, DeserializeRootElementName = deserializeRootElementName, WriteArrayAttribute = writeArrayAttribute } } }
        ));
}

现在您将能够:

var root = (JObject)xmldoc.DocumentElement.ToJToken(omitRootObject : true);
var array = root.PropertyValues().SingleOrDefault();
string js = array.ToString();

演示 fiddle here .

关于c# - 没有数组名称的XML到Json c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73480116/

相关文章:

c# - IList<T> 作为泛型返回

c# - 为了学习正确的编程概念,我应该开发什么样的应用程序

c# - Nhibernate 不存在的地方

javascript - 如何使用 Javascript 更改 JSON 对象

json - 读取本地 JSON 文件并使用它来填充 UITableView

java - 聊天 Android 应用程序中的气球

c# - 在不等待的情况下调用异步方法

javascript - 将函数传递给 JSON.stringify

.net - 显示二元决策树的工具

java - 告诉 SAX 解析器忽略无效字符?