如何在C#中将JSON转换为XML或将XML转换为JSON?

331

我开始使用Json.NET将JSON格式的字符串转换为对象,或者反过来。我不确定在Json.NET框架中是否可以将JSON格式的字符串转换为XML格式,或者反之亦然?


请注意,正如StaxMan所说,如果元素节点中有空格,则xml将忽略它。例如,“学生ID”:11000由于属性名称中有空格,因此不会出现在xml结果中。xml不接受元素节点内有空格的情况。 - Daniel B
快速回答:如果您查看文档,可以将JSON转换为Xml,网址为https://www.newtonsoft.com/json/help/html/ConvertJsonToXml.htm,将`Xml转换为JSON`,网址为https://www.newtonsoft.com/json/help/html/ConvertXmlToJson.htm。 - Vinod Srivastav
14个回答

0

Cinchoo ETL - 一个开源库,可用于轻松地将Xml转换为JSON,只需几行代码即可完成。

Xml -> JSON:

using (var p = new ChoXmlReader("sample.xml"))
{
    using (var w = new ChoJSONWriter("sample.json"))
    {
        w.Write(p);
    }
}

JSON -> Xml:

using (var p = new ChoJsonReader("sample.json"))
{
    using (var w = new ChoXmlWriter("sample.xml"))
    {
        w.Write(p);
    }
}

示例代码片段:https://dotnetfiddle.net/enUJKu

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

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


尝试将GPO策略的XML文件转换,但在解析ChoXmlReader(v1.2.1.44)时,要么遇到错误,要么返回空括号。对我来说毫无用处。 - B8ightY
你尝试过什么?请提供一个可工作的示例。示例链接:https://dotnetfiddle.net/vrx3x7 - Cinchoo

0
我按照David Brown所说的做了,但是我得到了以下异常。
$exception {"There are multiple root elements. Line , position ."} System.Xml.XmlException

一种解决方案是通过修改带有根元素的XML文件,但这并不总是必要的,对于XML流可能也不可行。下面是我的解决方案:

var path = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\App_Data"));
var directoryInfo = new DirectoryInfo(path);
var fileInfos = directoryInfo.GetFiles("*.xml");

foreach (var fileInfo in fileInfos)
{
    XmlDocument doc = new XmlDocument();
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ConformanceLevel = ConformanceLevel.Fragment;

    using (XmlReader reader = XmlReader.Create(fileInfo.FullName, settings))
    {
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            {
                var node = doc.ReadNode(reader);
                string json = JsonConvert.SerializeXmlNode(node);
            }
        }
    }
}

导致错误的示例 XML:

<parent>
    <child>
        Text
    </child>
</parent>
<parent>
    <child>
        <grandchild>
            Text
        </grandchild>
        <grandchild>
            Text
        </grandchild>
    </child>
    <child>
        Text
    </child>
</parent>

1
你的示例XML不是一个XML文档,因为它没有单一的根节点。但它可能是一个XML片段。 - Robert McKee

0
这是一个使用.NET内置库(而不是像Newtonsoft这样的第三方库)将JSON转换为XML的示例。
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Xml.Linq;

XDocument xmlDoc = jsonToXml(jsonObj);

private XDocument jsonToXml(JsonObject obj)
{
  var xmlDoc = new XDocument();
  var root = new XElement("Root");
  xmlDoc.Add(root);

  foreach (var prop in obj)
  {
    var xElement = new XElement(prop.Key);
    xElement.Value = prop.Value.ToString();
    root.Add(xElement);
  }
  return xmlDoc;
}

-1

我已经使用了以下方法将JSON转换为XML

List <Item> items;
public void LoadJsonAndReadToXML() {
  using(StreamReader r = new StreamReader(@ "E:\Json\overiddenhotelranks.json")) {
    string json = r.ReadToEnd();
    items = JsonConvert.DeserializeObject <List<Item>> (json);
    ReadToXML();
  }
}

public void ReadToXML() {
  try {
    var xEle = new XElement("Items",
      from item in items select new XElement("Item",
        new XElement("mhid", item.mhid),
        new XElement("hotelName", item.hotelName),
        new XElement("destination", item.destination),
        new XElement("destinationID", item.destinationID),
        new XElement("rank", item.rank),
        new XElement("toDisplayOnFod", item.toDisplayOnFod),
        new XElement("comment", item.comment),
        new XElement("Destinationcode", item.Destinationcode),
        new XElement("LoadDate", item.LoadDate)
      ));

    xEle.Save("E:\\employees.xml");
    Console.WriteLine("Converted to XML");
  } catch (Exception ex) {
    Console.WriteLine(ex.Message);
  }
  Console.ReadLine();
}

我使用名为Item的类来表示元素。

public class Item {
  public int mhid { get; set; }
  public string hotelName { get; set; }
  public string destination { get; set; }
  public int destinationID { get; set; }
  public int rank { get; set; }
  public int toDisplayOnFod { get; set; }
  public string comment { get; set; }
  public string Destinationcode { get; set; }
  public string LoadDate { get; set; }
}

它有效....


嗨,如果您阅读了问题,它已经标记为“Json.NET”,并且询问如何使用“Json.NET”进行操作,而不是如何在没有“Json.NET”的情况下进行操作。如果您理解了这一点,请使用“Json.NET”更新您的答案。 - Vinod Srivastav

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