无法将JSON转换为CSV

问题描述:

我正在尝试从Web API解析Json内容并使用以下代码转换为csv但不起作用。我得到的错误是
"  不能 添加  A 嵌套 关系 或 一个 元件 柱 至  A 表 含有  A  simpleContent的 柱" 强>

I am trying to parse the Json content from web API and convert to csv using the following code but isnt working. the error that i get is " Cannot add a nested relation or an element column to a table containing a SimpleContent column."

提前感谢您的帮助!!!

使用System;

使用System.IO;

使用System.Net;

使用System.Text;

使用System.Collections.Generic;

使用System。数据;

使用System.Linq;

使用System.Data.DataSetExtensions;

使用System.Web;

使用Newtonsoft.Json;

使用CsvHelper;

使用System.Net.Http;

使用System.Runtime;

使用System.Xml;






$
命名空间SerraviewAPI

{

   公共课Webrequest

    {

       静态字符串内容;

        public static void Main()

        {



Webrequest.content =" {\" id \": \" Table_4155\",\" headers\":[\" OrgUnitName\",\" CostCentre\",\" Level\" ,\" OrgUnitLevel0\",\" CostCentreOnLevel0\",\" OrgUnitLevel1\",\" CostCentreOnLevel1\",\" OrgUnitLevel2\" ,\" CostCentreOnLevel2\",\" OrgUnitLevel3\",\" CostCentreOnLevel3\",\" OrgUnitLevel4\",\" CostCentreOnLevel4\" ,\" OrgUnitLevel5\",\" CostCentreOnLevel5\",\" OrgUnitLevel6\",\" CostCentreOnLevel6\&QUOT],\" rows\&QUOT ;:[[\"计费Europe\",\" 5583\",\" 6\",\" LinkedIn \\",\" D000\",\" GWS / FIN\",\" D050\",\" CorporateManagement\",\" D1P0\",\"金融与Accounting\",\" D2P2\",\" CAOOrganization\",\" D3P1\",\ " ControllershipOrg\",\" D4P1\",\"计费Europe\",\" 5583\"],[\" AdvertisingOperations\&QUOT ;,\" 1900\",\" 6\",\" LinkedIn\",\" D000\",\" GSO\&QUOT ;,\" D020\",\" Advertising\",\" D1C0\",\" AdvertisingOperations\",\" D2C1\&QUOT ;,\" AdvertisingOperations\",\" D3C1\",\" AdvertisingOperations\",\" D4C1\",\" AdvertisingOpe rations\",\" 1900 \"]]
}";       

jsonStringToCSV(内容);

       }
$


        public static void jsonStringToCSV(string jsonContent)

        {

            //使用NewtonSoft json nuget包

            XmlNode xml = JsonConvert.DeserializeXmlNode(" {records:{record:" + Webrequest.content +"}}");

            XmlDocument xmldoc = new XmlDocument();

            xmldoc.LoadXml(xml.InnerXml);

            XmlReader xmlReader = new XmlNodeReader(xml);

            DataSet dataSet = new DataSet();

            dataSet.ReadXml(xmlReader);

            var dataTable = dataSet.Tables [1];



            // Datatable to CSV

  &NBSP; &NBSP; &NBSP; &NBSP;   var lines = new List< string>();

  &NBSP; &NBSP; &NBSP; &NBSP;   string [] columnNames = dataTable.Columns.Cast< DataColumn>()。

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;  选择(column => column.ColumnName)。

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   ToArray();

  &NBSP; &NBSP; &NBSP; &NBSP;   var header = string.Join(",",columnNames);

  &NBSP; &NBSP; &NBSP; &NBSP;   lines.Add(header);

  &NBSP; &NBSP; &NBSP; &NBSP;   var valueLines = dataTable.AsEnumerable()

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; .Select(row => string.Join(",",row.ItemArray));

  &NBSP; &NBSP; &NBSP; &NBSP;   lines.AddRange(valueLines);

  &NBSP; &NBSP; &NBSP; &NBSP;   File.WriteAllLines(@" C:\ Users \ Feed \\\.csv",lines);

  &NBSP; &NBSP;  }

}

}

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Data.DataSetExtensions;
using System.Web;
using Newtonsoft.Json;
using CsvHelper;
using System.Net.Http;
using System.Runtime;
using System.Xml;




namespace SerraviewAPI
{
    public class Webrequest
    {
        static string content;
        public static void Main()
        {

Webrequest.content ="{\"id\":\"Table_4155\",\"headers\":[\"OrgUnitName\",\"CostCentre\",\"Level\",\"OrgUnitLevel0\",\"CostCentreOnLevel0\",\"OrgUnitLevel1\",\"CostCentreOnLevel1\",\"OrgUnitLevel2\",\"CostCentreOnLevel2\",\"OrgUnitLevel3\",\"CostCentreOnLevel3\",\"OrgUnitLevel4\",\"CostCentreOnLevel4\",\"OrgUnitLevel5\",\"CostCentreOnLevel5\",\"OrgUnitLevel6\",\"CostCentreOnLevel6\"],\"rows\":[[\"Accounting-Europe\",\"5583\",\"6\",\"LinkedIn\",\"D000\",\"GWS/FIN\",\"D050\",\"CorporateManagement\",\"D1P0\",\"Finance&Accounting\",\"D2P2\",\"CAOOrganization\",\"D3P1\",\"ControllershipOrg\",\"D4P1\",\"Accounting-Europe\",\"5583\"],[\"AdvertisingOperations\",\"1900\",\"6\",\"LinkedIn\",\"D000\",\"GSO\",\"D020\",\"Advertising\",\"D1C0\",\"AdvertisingOperations\",\"D2C1\",\"AdvertisingOperations\",\"D3C1\",\"AdvertisingOperations\",\"D4C1\",\"AdvertisingOperations\",\"1900\"]] }";       
jsonStringToCSV(content);
       }

       public static void jsonStringToCSV(string jsonContent)
       {
           //used NewtonSoft json nuget package
           XmlNode xml = JsonConvert.DeserializeXmlNode("{records:{record:" + Webrequest.content + "}}");
           XmlDocument xmldoc = new XmlDocument();
           xmldoc.LoadXml(xml.InnerXml);
           XmlReader xmlReader = new XmlNodeReader(xml);
           DataSet dataSet = new DataSet();
           dataSet.ReadXml(xmlReader);
           var dataTable = dataSet.Tables[1];

           //Datatable to CSV
           var lines = new List<string>();
           string[] columnNames = dataTable.Columns.Cast<DataColumn>().
                                             Select(column => column.ColumnName).
                                             ToArray();
           var header = string.Join(",", columnNames);
           lines.Add(header);
           var valueLines = dataTable.AsEnumerable()
                              .Select(row => string.Join(",", row.ItemArray));
           lines.AddRange(valueLines);
           File.WriteAllLines(@"C:\Users\Feed\1.csv", lines);
       }
}
}

您好,

首先,这里没有回答只是确认DataSet无法处理您的数据关系。

First off, no answer here just confirmation that a DataSet can not handle your data relationships.

您不能使用DataSet,它不知道如何处理您的关系。你在这里很好

You can't use a DataSet, it does not know how to handle your relationships. You are good here

var contents = "{records:{record:" + "{\"id\":\"Table_4155\",\"headers\":[\"OrgUnitName\",\"CostCentre\",\"Level\",\"OrgUnitLevel0\",\"CostCentreOnLevel0\",\"OrgUnitLevel1\",\"CostCentreOnLevel1\",\"OrgUnitLevel2\",\"CostCentreOnLevel2\",\"OrgUnitLevel3\",\"CostCentreOnLevel3\",\"OrgUnitLevel4\",\"CostCentreOnLevel4\",\"OrgUnitLevel5\",\"CostCentreOnLevel5\",\"OrgUnitLevel6\",\"CostCentreOnLevel6\"],\"rows\":[[\"Accounting-Europe\",\"5583\",\"6\",\"LinkedIn\",\"D000\",\"GWS/FIN\",\"D050\",\"CorporateManagement\",\"D1P0\",\"Finance&Accounting\",\"D2P2\",\"CAOOrganization\",\"D3P1\",\"ControllershipOrg\",\"D4P1\",\"Accounting-Europe\",\"5583\"],[\"AdvertisingOperations\",\"1900\",\"6\",\"LinkedIn\",\"D000\",\"GSO\",\"D020\",\"Advertising\",\"D1C0\",\"AdvertisingOperations\",\"D2C1\",\"AdvertisingOperations\",\"D3C1\",\"AdvertisingOperations\",\"D4C1\",\"AdvertisingOperations\",\"1900\"]] }" + "}}";
XmlNode xml = JsonConvert.DeserializeXmlNode(contents);
XmlDocument xmldoc = new XmlDocument();

xmldoc.LoadXml(xml.InnerXml);
var xmlReader = new XmlNodeReader(xmldoc);


所以我猜测dataSet.ReadXml就是问题。 所以你需要找出一个没有使用DataSet的方法。

So I'm guessing the dataSet.ReadXml is the issue.  So you will need to figure out a method w/o using a DataSet.