XML转JSON - 将Json对象转换为Json数组

3

在我的控制器中,我将XML数据转换为JSON,如下所示:

 var doc = new XmlDocument();
 doc.Load(xmlStream);
 doc.DocumentElement.RemoveAttribute("xmlns"); // don't want xmlns node in json

 return Json(doc.DocumentElement.ChildNodes, new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.Default }, Encoding.UTF8);

XML的格式如下:
<Employees xmlns="http://company.com/schemas">
    <Employee>
        <FirstName>name1</FirstName>
        <LastName>surname1</LastName>
    <Employee>
    <Employee>
        <FirstName>name2</FirstName>
        <LastName>surname2</LastName>
    <Employee>
    <Employee>
        <FirstName>name3</FirstName>
        <LastName>surname3</LastName>
    <Employee>
</Employees>

并输出JSON

[
    {
        "Employee": {
            "FirstName": "name1",
            "LastName": "surname1"
         }
    },
    {
        "Employee": {
            "FirstName": "name2",
            "LastName": "surname2"
         }
    },{
        "Employee": {
            "FirstName": "name3",
            "LastName": "surname3"
         }
    }
]

What I want to achieve

[
    {
        "FirstName": "name1",
        "LastName": "surname1"
    },
    {
        "FirstName": "name2",
        "LastName": "surname2"
    },{
        "FirstName": "name3",
        "LastName": "surname3"
    }
]

那么在将XML元素序列化为JSON时,是否有任何方法可以转换成JSON数组呢?我希望这是动态的,因此在操作时不需要编写实体类。

你能分享另一个 XML 的例子吗?(顺便说一下,你的不合法) - aloisdg
3个回答

2

我并不认为我的输出结果与你预期的相差甚远。我认为我们可以做得更好,但这是我的两行代码解决方案:

在线试用!

var doc = XDocument.Parse(xmlData);
var json = JsonConvert.SerializeXNode(doc);

输出:

{
  "Employees": {
    "@xmlns": "http://company.com/schemas",
    "Employee": [{
      "FirstName": "name1",
      "LastName": "surname1"
    }, {
      "FirstName": "name2",
      "LastName": "surname2"
    }, {
      "FirstName": "name3",
      "LastName": "surname3"
    }]
  }
}

由于schema是固定的,因此可以通过遍历对象来访问该对象:

var employees = JObject.Parse(json).Children().Children().Children().ElementAt(1).Children().First();

Try it online!


1
谢谢,那真的帮了我很多。我只需要添加 var employees = JObject.Parse(json).Children().Children().Children().ElementAt(1).Children().First(); 就可以得到我想要的结果。它看起来可能不是那么动态,但 XML 结构始终相同,只有名称会更改,因此它将适用于我拥有的所有文件。这是您编辑过的 fiddle 链接 - Peter
@Peter 很高兴能够帮助。我将在问题中添加这行代码和示例。 - aloisdg

0

使用Cinchoo ETL - 一个开源库,您可以轻松地用几行代码将Xml转换为Json

string xml = @"<Employees xmlns=""http://company.com/schemas"">
    <Employee>
        <FirstName>name1</FirstName>
        <LastName>surname1</LastName>
    </Employee>
    <Employee>
        <FirstName>name2</FirstName>
        <LastName>surname2</LastName>
    </Employee>
    <Employee>
        <FirstName>name3</FirstName>
        <LastName>surname3</LastName>
    </Employee>
</Employees>
";

StringBuilder sb = new StringBuilder();
using (var p = ChoXmlReader.LoadText(xml)
    )
{
    using (var w = new ChoJSONWriter(sb))
        w.Write(p);
}

Console.WriteLine(sb.ToString());

输出:

[
 {
  "FirstName": "name1",
  "LastName": "surname1"
 },
 {
  "FirstName": "name2",
  "LastName": "surname2"
 },
 {
  "FirstName": "name3",
  "LastName": "surname3"
 }
]

请查看CodeProject文章以获取更多帮助。

免责声明:本库的作者为我。


0

如果您在之前将其反序列化为对象数组,则可以实现这一点。就像这样:

    class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    static void DoXmlToJson()
    {
        string xmlData = @"<?xml version='1.0' encoding='UTF-8'?>
                          <Employees>
                            <Employee>
                                <FirstName>name1</FirstName>
                                <LastName>surname1</LastName>
                            </Employee>
                            <Employee>
                                <FirstName>name2</FirstName>
                                <LastName>surname2</LastName>
                            </Employee>
                            <Employee>
                                <FirstName>name3</FirstName>
                                <LastName>surname3</LastName>
                            </Employee>
                        </Employees>";

        XDocument doc = XDocument.Parse(xmlData);
        var array = doc.Root.Elements()
            .Select(row => new Employee() {
                FirstName = row.Element("FirstName").Value,
                LastName = row.Element("LastName").Value
            });

        string json = JsonConvert.SerializeObject(array);

        Console.WriteLine(json);
    }

使用 XmlSerializer.Deserialze 的另一种方式:

    public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    public class Employees
    {
        [XmlElement("Employee")]
        public Employee[] Items { get; set; }
    }

    static void DoXmlToJson()
    {
        string xmlData = @"<Employees>
                            <Employee>
                                <FirstName>name1</FirstName>
                                <LastName>surname1</LastName>
                            </Employee>
                            <Employee>
                                <FirstName>name2</FirstName>
                                //<LastName>surname2</LastName>
                            </Employee>
                            <Employee>
                                <FirstName>name3</FirstName>
                                <LastName>surname3</LastName>
                            </Employee>
                        </Employees>";


        XmlSerializer xmlSerializer = new XmlSerializer(typeof(Employees));
        MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData));
        Employees wholeObject = (Employees)xmlSerializer.Deserialize(memoryStream);

        string json = JsonConvert.SerializeObject(wholeObject.Items);

        Console.WriteLine(json);
    }

无论哪种情况,输出看起来都像这样:

[
  {
    "FirstName": "name1",
    "LastName": "surname1"
  },
  {
    "FirstName": "name2",
    "LastName": "surname2"
  },
  {
    "FirstName": "name3",
    "LastName": "surname3"
  }
]

好的,正如我所说,我想让它变得动态化,因此我不想编写实体类似于“员工”类的类。 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接