【问题标题】:XDocument or XmlDocument to JSON with C#使用 C# 将 XDocument 或 XmlDocument 转换为 JSON
【发布时间】:2014-10-28 10:03:40
【问题描述】:

我有这个很棒的 XML:

<Products>
  <Product ProductCode="C1010" CategoryName="Coins" />
  <Product ProductCode="C1012" CategoryName="Coins" />
  <Product ProductCode="C1013" CategoryName="Coins" />
</Products>

但它输出到这个 JSON:

{"Products":{"Product":[{"@ProductCode":"C1010","@CategoryName":"Coins"},
                        {"@ProductCode":"C1012","@CategoryName":"Coins"},     
                        {"@ProductCode":"C1013","@CategoryName":"Coins"}]}}

我希望我的 json 中没有“产品”子级别,因为所有三行都是产品。这是我的 C# 代码:

//x is an XDocument. 
JsonConvert.SerializeXNode(x, Formatting.None, false)
//JsonConvert.SerializeXNode(x); //I also tried without the formatting and the boolean. 

当我将 XDocument '转换' 为 XmlDocument 并使用时:

var xmlDocument = new System.Xml.XmlDocument();
using (var xmlReader = x.CreateReader())
{
    xmlDocument.Load(xmlReader);
}
JsonConvert.SerializeXmNode(xmlDocument);

它给了我完全相同的输出。那么如何修改我的 JSON 解析,以便我有一个简单的产品列表。我更喜欢最干净的解决方案。

为了更清楚一点,我想输出这样的东西:

[{"@ProductCode":"C1010","@CategoryName":"Coins"},
{"@ProductCode":"C1012","@CategoryName":"Coins"},     
{"@ProductCode":"C1013","@CategoryName":"Coins"}]

【问题讨论】:

  • 您可能知道,JSON-output 代表XML-input。要改变它,你就是在“破坏”它。
  • 你试过打电话给JsonConvert.SerializeXNode(x, Formatting.None, true)吗?应该省略根节点。
  • 大声笑,翻转布尔值正是我所需要的!谢谢@Jehof

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


【解决方案1】:

使用方法调用

JsonConvert.SerializeXNode(x, Formatting.None, true);

这将省略根节点,并应创建您所期望的。

【讨论】:

    【解决方案2】:

    使用 xml writer 或 con version 的 Instread 只需从原始 xml 文件中读取并写入新文件使用文件流 writer。

    基本上你会是:

    List xml_retrevedData = new List();
    FileStramWriter fr = new FileStramWriter(); 
    fr.Write("{"Products":[{"@ProductCode":" //colection item 
    variable1.data1","@CategoryName":"//colection item 
    variable1.data2"}, {"@ProductCode":"//colection item 
    variable2.data1","@CategoryName":"//colection item 
    variable11.data1"},
    {"@ProductCode":"//colection item variable13.data1","@CategoryName":"//colection item variable13.data3"}]}"); 
    // in side the file stream Writer
    

    【讨论】:

    • 呃,我想要一个 json 文件,但我不明白你打算如何将 xml 转换为 json,你能详细说明一下吗?
    • 通过 LinQ 解析 xml 文件并将其保存为一个集合,也可以直接写入 jason 文件格式。最好的方法是通过隔离文件流在隔离存储中创建一个文件并将文件命名为 filename.jason .. 然后您可以使用文件写入在文件中写入 ..但不要忘记将其自定义为 jason 格式.. .
    • 基本上你会是" {"Products":[{"@ProductCode":"//colection item variable 1.data1","@CategoryName":"//colection item variable 1.data2 "}, {"@ProductCode":"//收集项变量2.data1","@CategoryName":"//收集项变量11.data1"}, {"@ProductCode":"//收集项变量13.data1 ","@CategoryName":"//collection item variable13.data3"}]} " 在文件流 Writer 中
    【解决方案3】:

    试试这个

    public string getData(ref XmlDocument doc) {
    
            JObject productobj = new JObject();
    
            var productsenum = from p in doc.GetElementsByTagName("product").Cast<XmlElement>()
                               select p;
    
            JArray products = new JArray();
            foreach (XmlElement p in productsenum) {
                JObject pobj = new JObject();
                pobj["ProductCode"] = p.GetAttribute("ProductCode");
                pobj["CategoryName"]= p.GetAttribute("CategoryName");
    
                products.Add(pobj);
            }
    
            JObject product = new JObject();
            product["Product"] = products;
    
            productobj["Products"] = product;
    
            return productobj.ToString();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 2010-12-05
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多