简体   繁体   English

如何将C#中的不同DataSet组合成单个JSON Object

[英]How to combine different DataSet into single JSON Object in C#

I have an excel with couple of sheets.我有一个 excel 和几张纸。 From them in the two sheets, there are 100's of rows available.在这两张纸中,有 100 行可用。 I am trying to read the file and convert the two tables of data into JSON. I am using the ExcelDataReader NuGet package to get data from the Excel file.我正在尝试读取文件并将两个数据表转换为 JSON。我正在使用 ExcelDataReader NuGet package 从 Excel 文件中获取数据。 I am successfully able to access the data, let's say there are 10 sheets, and out of those 10, I am getting data from two similar sheets.我能够成功访问数据,假设有 10 张,在这 10 张中,我从两张相似的工作表中获取数据。 The expectation is to get the two DataSet and convert them into single JSON Object.期望是得到两个DataSet,转换成单个JSON Object。

Sample Data from Sheet Downhole Logging Data:来自表层井下测井数据的样本数据:

[
  {
    "Column0": null,
    "Hole Size (Enter Hole Size)": "No",
    "Hole Size (Enter Hole Size)_1": "Yes",
    "Hole Size (Enter Hole Size)_2": "Yes",
    "Hole Size (Enter Hole Size)_3": "Yes",
    "Hole Size (Enter Hole Size)_4": "Yes",
    "Hole Size (Enter Hole Size)_5": "No",
    "Hole Size (Enter Hole Size)_6": "No",
    "Hole Size (Enter Hole Size)_7": "No",
    "Template Trace Label\n(PDT Label)": "ABG Comb Gamma Ray BC RT",
    "Tool": "ABG",
    "InSite Record": "ABG RT",
    "Insite Variable Curve Label": "Gamma Ray KclBh",
    "InSite Mnemonic\nUse for Halvue Header": "BGCGC-T",
    "Wellbase Depth Descriptor": "Desc Run",
    "Wellbase Time Descriptor": "Desc Run",
    "Wellbase Depth Descriptor Name": "MWD-T",
    "Wellbase Time Descriptor Name": "MWD-T",
    "Time": "X",
    "Depth": "X",
    "IA": "X",
    "WITSML": "X",
    "Default Units": "API",
    "Min": 0.0,
    "Max": 150.0,
    "Trace Notes": null,
    "Data frequency": 1.21,
    "No": null,
    "No_1": null,
    "No_2": null,
    "No_3": null,
    "No_4": null,
    "No_5": null,
    "No_6": null,
    "No_7": null,
    "ROP Avg": null,
    "Surface Data": null,
    "ROP Avg_1": null,
    "ROPAVG": null,
    "Desc Run": null,
    "Desc Run_1": null,
    "0 | Desc Run Depth | Logging | Logging | ROP Avg |  |": null,
    "0 | Desc Run Time | SDL | ROP | ROP Avg |  |": null,
    "X": null,
    "X_1": null,
    "X_2": null,
    "X_3": null,
    "m/h": null,
    "Column22": null,
    "Column23": null,
    "Column24": null,
    "5.34": null
  },
  {
    "Column0": null,
    "Hole Size (Enter Hole Size)": "No",
    "Hole Size (Enter Hole Size)_1": "No",
    "Hole Size (Enter Hole Size)_2": "No",
    "Hole Size (Enter Hole Size)_3": "No",
    "Hole Size (Enter Hole Size)_4": "No",
    "Hole Size (Enter Hole Size)_5": "No",
    "Hole Size (Enter Hole Size)_6": "No",
    "Hole Size (Enter Hole Size)_7": "No",
    "Template Trace Label\n(PDT Label)": "Gamma Ray Image RT",
    "Tool": "ABG",
    "InSite Record": "ABG RT",
    "Insite Variable Curve Label": "ABG Comb Gamma Azi HS BC RT",
    "InSite Mnemonic\nUse for Halvue Header": "BGCGHC-T",
    "Wellbase Depth Descriptor": "Desc Run",
    "Wellbase Time Descriptor": "Desc Run",
    "Wellbase Depth Descriptor Name": "MWD-T",
    "Wellbase Time Descriptor Name": "MWD-T",
    "Time": "X",
    "Depth": "X",
    "IA": "X",
    "WITSML": "X",
    "Default Units": "API",
    "Min": 0.0,
    "Max": 150.0,
    "Trace Notes": null,
    "Data frequency": 2.45,
    "No": null,
    "No_1": null,
    "No_2": null,
    "No_3": null,
    "No_4": null,
    "No_5": null,
    "No_6": null,
    "No_7": null,
    "ROP Avg": null,
    "Surface Data": null,
    "ROP Avg_1": null,
    "ROPAVG": null,
    "Desc Run": null,
    "Desc Run_1": null,
    "0 | Desc Run Depth | Logging | Logging | ROP Avg |  |": null,
    "0 | Desc Run Time | SDL | ROP | ROP Avg |  |": null,
    "X": null,
    "X_1": null,
    "X_2": null,
    "X_3": null,
    "m/h": null,
    "Column22": null,
    "Column23": null,
    "Column24": null,
    "5.34": null
  }
]

Sample Data from Sheet Surface Logging Data:来自板材表面记录数据的示例数据:

[
  {
    "Column0": null,
    "Hole Size (Enter Hole Size)": null,
    "Hole Size (Enter Hole Size)_1": null,
    "Hole Size (Enter Hole Size)_2": null,
    "Hole Size (Enter Hole Size)_3": null,
    "Hole Size (Enter Hole Size)_4": null,
    "Hole Size (Enter Hole Size)_5": null,
    "Hole Size (Enter Hole Size)_6": null,
    "Hole Size (Enter Hole Size)_7": null,
    "Template Trace Label\n(PDT Label)": null,
    "Tool": null,
    "InSite Record": null,
    "Insite Variable Curve Label": null,
    "InSite Mnemonic\nUse for Halvue Header": null,
    "Wellbase Depth Descriptor": null,
    "Wellbase Time Descriptor": null,
    "Wellbase Depth Descriptor Name": null,
    "Wellbase Time Descriptor Name": null,
    "Time": null,
    "Depth": null,
    "IA": null,
    "WITSML": null,
    "Default Units": null,
    "Min": null,
    "Max": null,
    "Trace Notes": null,
    "Data frequency": null,
    "No": "No",
    "No_1": "No",
    "No_2": "No",
    "No_3": "No",
    "No_4": "No",
    "No_5": "No",
    "No_6": "No",
    "No_7": "No",
    "ROP Avg": "Fill in Label",
    "Surface Data": "Type of Data ",
    "ROP Avg_1": "Fill in Label",
    "ROPAVG": "Fill in Record",
    "Desc Run": "Fill in Variable",
    "Desc Run_1": "Mnemonic",
    "0 | Desc Run Depth | Logging | Logging | ROP Avg |  |": "Fill in Descriptor",
    "0 | Desc Run Time | SDL | ROP | ROP Avg |  |": "Fill in Name",
    "X": "-",
    "X_1": "-",
    "X_2": "-",
    "X_3": "-",
    "m/h": "-",
    "Column22": "-",
    "Column23": "-",
    "Column24": "-",
    "5.34": null
  },
  {
    "Column0": null,
    "Hole Size (Enter Hole Size)": null,
    "Hole Size (Enter Hole Size)_1": null,
    "Hole Size (Enter Hole Size)_2": null,
    "Hole Size (Enter Hole Size)_3": null,
    "Hole Size (Enter Hole Size)_4": null,
    "Hole Size (Enter Hole Size)_5": null,
    "Hole Size (Enter Hole Size)_6": null,
    "Hole Size (Enter Hole Size)_7": null,
    "Template Trace Label\n(PDT Label)": null,
    "Tool": null,
    "InSite Record": null,
    "Insite Variable Curve Label": null,
    "InSite Mnemonic\nUse for Halvue Header": null,
    "Wellbase Depth Descriptor": null,
    "Wellbase Time Descriptor": null,
    "Wellbase Depth Descriptor Name": null,
    "Wellbase Time Descriptor Name": null,
    "Time": null,
    "Depth": null,
    "IA": null,
    "WITSML": null,
    "Default Units": null,
    "Min": null,
    "Max": null,
    "Trace Notes": null,
    "Data frequency": null,
    "No": "No",
    "No_1": "No",
    "No_2": "No",
    "No_3": "No",
    "No_4": "No",
    "No_5": "No",
    "No_6": "No",
    "No_7": "No",
    "ROP Avg": "Fill in Label",
    "Surface Data": "Type of Data ",
    "ROP Avg_1": "Fill in Label",
    "ROPAVG": "Fill in Record",
    "Desc Run": "Fill in Variable",
    "Desc Run_1": "Mnemonic",
    "0 | Desc Run Depth | Logging | Logging | ROP Avg |  |": "Fill in Descriptor",
    "0 | Desc Run Time | SDL | ROP | ROP Avg |  |": "Fill in Name",
    "X": "-",
    "X_1": "-",
    "X_2": "-",
    "X_3": "-",
    "m/h": "-",
    "Column22": "-",
    "Column23": "-",
    "Column24": "-",
    "5.34": null
  }
]

I'm using the below code to get the DataSets and merge them into a single DataSet.我正在使用下面的代码来获取数据集并将它们合并到一个数据集中。 After that I convert that into Json.之后我将其转换为 Json。

private DataTable GetDownholeLoggingData(IFormFile file)
        {

            DataTable wellAndContact;

            using (var stream = file.OpenReadStream())
            {
                using (var memstrm = new MemoryStream())
                {
                    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
                    stream.CopyTo(memstrm);

                    var reader = ExcelReaderFactory.CreateReader(stream);
                    var workSheet = reader.AsDataSet(new ExcelDataSetConfiguration()
                    {
                        ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
                        {
                            UseHeaderRow = true,
                            ReadHeaderRow = (rowReader) => {
                                for(int i=0; i<9; i++)
                                {
                                    rowReader.Read();
                                }
                            },
                          
                        }
                    });

                    wellAndContact = workSheet.Tables[2];
                    wellAndContact.TableName = workSheet.Tables[2].TableName;
                    var newV = workSheet.Tables[3];
                    newV.TableName = workSheet.Tables[3].TableName;
                    wellAndContact.Merge(workSheet.Tables[3]);
                }
            }

            return wellAndContact;
                    
        }

But my expectation is to get the two sheet of data combined as different Json Class in a single Object, like Below:但我的期望是将两张数据合并为一个 Object 中的不同 Json Class,如下所示:

{
    "Downhole Logging Data": [
        {
          "Column0": null,
          "Hole Size (Enter Hole Size)": "No",
          "Hole Size (Enter Hole Size)_1": "Yes",
          "Hole Size (Enter Hole Size)_2": "Yes",
          "Hole Size (Enter Hole Size)_3": "Yes",
          "Hole Size (Enter Hole Size)_4": "Yes",
          "Hole Size (Enter Hole Size)_5": "No",
          "Hole Size (Enter Hole Size)_6": "No",
          "Hole Size (Enter Hole Size)_7": "No",
          "Template Trace Label\n(PDT Label)": "ABG Comb Gamma Ray BC RT",
          "Tool": "ABG",
          "InSite Record": "ABG RT",
          "Insite Variable Curve Label": "Gamma Ray KclBh",
          "InSite Mnemonic\nUse for Halvue Header": "BGCGC-T",
          "Wellbase Depth Descriptor": "Desc Run",
          "Wellbase Time Descriptor": "Desc Run",
          "Wellbase Depth Descriptor Name": "MWD-T",
          "Wellbase Time Descriptor Name": "MWD-T",
          "Time": "X",
          "Depth": "X",
          "IA": "X",
          "WITSML": "X",
          "Default Units": "API",
          "Min": 0.0,
          "Max": 150.0,
          "Trace Notes": null,
          "Data frequency": 1.21
        },
        {
          "Column0": null,
          "Hole Size (Enter Hole Size)": "No",
          "Hole Size (Enter Hole Size)_1": "No",
          "Hole Size (Enter Hole Size)_2": "No",
          "Hole Size (Enter Hole Size)_3": "No",
          "Hole Size (Enter Hole Size)_4": "No",
          "Hole Size (Enter Hole Size)_5": "No",
          "Hole Size (Enter Hole Size)_6": "No",
          "Hole Size (Enter Hole Size)_7": "No",
          "Template Trace Label\n(PDT Label)": "Gamma Ray Image RT",
          "Tool": "ABG",
          "InSite Record": "ABG RT",
          "Insite Variable Curve Label": "ABG Comb Gamma Azi HS BC RT",
          "InSite Mnemonic\nUse for Halvue Header": "BGCGHC-T",
          "Wellbase Depth Descriptor": "Desc Run",
          "Wellbase Time Descriptor": "Desc Run",
          "Wellbase Depth Descriptor Name": "MWD-T",
          "Wellbase Time Descriptor Name": "MWD-T",
          "Time": "X",
          "Depth": "X",
          "IA": "X",
          "WITSML": "X",
          "Default Units": "API",
          "Min": 0.0,
          "Max": 150.0,
          "Trace Notes": null,
          "Data frequency": 2.45
        }
    ],
    "Surface Logging Data": [
        {
    "Column0": null,
    "Hole Size (Enter Hole Size)": "No",
    "Hole Size (Enter Hole Size)_1": "No",
    "Hole Size (Enter Hole Size)_2": "No",
    "Hole Size (Enter Hole Size)_3": "No",
    "Hole Size (Enter Hole Size)_4": "No",
    "Hole Size (Enter Hole Size)_5": "No",
    "Hole Size (Enter Hole Size)_6": "No",
    "Hole Size (Enter Hole Size)_7": "No",
    "Template Trace Label\n(PDT Label)": "XBAT Comp Slowness 1 RT",
    "Tool": "XBAT",
    "InSite Record": "XBAT RT",
    "Insite Variable Curve Label": "DTC1",
    "InSite Mnemonic\nUse for Halvue Header": "XBC1-T",
    "Wellbase Depth Descriptor": "Desc Run",
    "Wellbase Time Descriptor": "Desc Run",
    "Wellbase Depth Descriptor Name": "MWD-T",
    "Wellbase Time Descriptor Name": "MWD-T",
    "Time": "X",
    "Depth": "X",
    "IA": "X",
    "WITSML": "X",
    "Default Units": "-",
    "Min": "-",
    "Max": "-",
    "Trace Notes": "-",
    "Data frequency": 753.89,
    "No": null,
    "No_1": null,
    "No_2": null,
    "No_3": null,
    "No_4": null,
    "No_5": null,
    "No_6": null,
    "No_7": null,
    "ROP Avg": null,
    "Surface Data": null,
    "ROP Avg_1": null,
    "ROPAVG": null,
    "Desc Run": null,
    "Desc Run_1": null,
    "0 | Desc Run Depth | Logging | Logging | ROP Avg |  |": null,
    "0 | Desc Run Time | SDL | ROP | ROP Avg |  |": null,
    "X": null,
    "X_1": null,
    "X_2": null,
    "X_3": null,
    "m/h": null,
    "Column22": null,
    "Column23": null,
    "Column24": null,
    "5.34": null
  },
  {
    "Column0": null,
    "Hole Size (Enter Hole Size)": "No",
    "Hole Size (Enter Hole Size)_1": "No",
    "Hole Size (Enter Hole Size)_2": "No",
    "Hole Size (Enter Hole Size)_3": "No",
    "Hole Size (Enter Hole Size)_4": "No",
    "Hole Size (Enter Hole Size)_5": "No",
    "Hole Size (Enter Hole Size)_6": "No",
    "Hole Size (Enter Hole Size)_7": "No",
    "Template Trace Label\n(PDT Label)": "XBAT Comp Slowness 2 RT",
    "Tool": "XBAT",
    "InSite Record": "XBAT RT",
    "Insite Variable Curve Label": "DTC2",
    "InSite Mnemonic\nUse for Halvue Header": "XBC2-T",
    "Wellbase Depth Descriptor": "Desc Run",
    "Wellbase Time Descriptor": "Desc Run",
    "Wellbase Depth Descriptor Name": "MWD-T",
    "Wellbase Time Descriptor Name": "MWD-T",
    "Time": "X",
    "Depth": "X",
    "IA": "X",
    "WITSML": "X",
    "Default Units": "-",
    "Min": "-",
    "Max": "-",
    "Trace Notes": "-",
    "Data frequency": 755.13,
    "No": null,
    "No_1": null,
    "No_2": null,
    "No_3": null,
    "No_4": null,
    "No_5": null,
    "No_6": null,
    "No_7": null,
    "ROP Avg": null,
    "Surface Data": null,
    "ROP Avg_1": null,
    "ROPAVG": null,
    "Desc Run": null,
    "Desc Run_1": null,
    "0 | Desc Run Depth | Logging | Logging | ROP Avg |  |": null,
    "0 | Desc Run Time | SDL | ROP | ROP Avg |  |": null,
    "X": null,
    "X_1": null,
    "X_2": null,
    "X_3": null,
    "m/h": null,
    "Column22": null,
    "Column23": null,
    "Column24": null,
    "5.34": null
  }
]
}

Can anyone help on how to achieve the above result.任何人都可以帮助实现上述结果。 Thanks in advance.提前致谢。

I did not read your code, because I did not recognize this code as creating a json (sorry, my fault!)我没有阅读您的代码,因为我没有将此代码识别为创建 json(对不起,我的错!)

With the code, as shown below, this output is created:使用代码,如下所示,创建了这个 output:

json1: {"Column0":null,"MyProperty1":"one","MyProperty2":"two"}
json2: {"Column0":null,"MyProperty1":"11","MyProperty2":"22"}
jsonTotal1: [{"Column0":null,"MyProperty1":"one","MyProperty2":"two"},{"Column0":null,"MyProperty1":"11","MyProperty2":"22"}]
jsonTotal2: {"sheet1":{"Column0":null,"MyProperty1":"one","MyProperty2":"two"},"sheet2":{"Column0":null,"MyProperty1":"11","MyProperty2":"22"}}

With this code jsonTotal1 look about the same as you final JSON, and jsonTotal2 has named sheets.使用此代码jsonTotal1看起来与最终的 JSON 大致相同,而jsonTotal2已命名为 sheets。

NOTE: I know my data is not the same as your data, (also structure is different, because I left out the rows that you have in a sheet)注意:我知道我的数据与您的数据不同(结构也不同,因为我遗漏了工作表中的行)

Code:代码:

Program.cs程序.cs

using Newtonsoft.Json;

ConsoleApp21.Sheet sheet1 = new ConsoleApp21.Sheet()
{
    Column0 = null,
    MyProperty1 = "one",
    MyProperty2 = "two"
};

ConsoleApp21.Sheet sheet2 = new ConsoleApp21.Sheet()
{
    Column0 = null,
    MyProperty1 = "11",
    MyProperty2 = "22"
};

string json1 = JsonConvert.SerializeObject(sheet1);
string json2 = JsonConvert.SerializeObject(sheet2);

// This will create the same as yours:
string jsonTotal = JsonConvert.SerializeObject(new object[] { sheet1, sheet2 });

Console.WriteLine($"json1: {json1}");
Console.WriteLine($"json2: {json2}");
Console.WriteLine($"jsonTotal1: {jsonTotal}");

ConsoleApp21.workbook wb = new ConsoleApp21.workbook();
wb.sheet1 = sheet1;
wb.sheet2 = sheet2;

// Now the sheets have a name:
jsonTotal = JsonConvert.SerializeObject(wb);
Console.WriteLine($"jsonTotal2: {jsonTotal}");

Sheet.cs工作表.cs

namespace ConsoleApp21
{
    public class Sheet
    {
        public int? Column0 { get; set; }
        public string MyProperty1 { get; set; }
        public string MyProperty2 { get; set; }

    }

    public class workbook
    {
        public Sheet sheet1 { get; set; }
        public Sheet sheet2 { get; set; }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM