簡體   English   中英

如何將C#中的不同DataSet組合成單個JSON Object

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

我有一個 excel 和幾張紙。 在這兩張紙中,有 100 行可用。 我正在嘗試讀取文件並將兩個數據表轉換為 JSON。我正在使用 ExcelDataReader NuGet package 從 Excel 文件中獲取數據。 我能夠成功訪問數據,假設有 10 張,在這 10 張中,我從兩張相似的工作表中獲取數據。 期望是得到兩個DataSet,轉換成單個JSON Object。

來自表層井下測井數據的樣本數據:

[
  {
    "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
  }
]

來自板材表面記錄數據的示例數據:

[
  {
    "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
  }
]

我正在使用下面的代碼來獲取數據集並將它們合並到一個數據集中。 之后我將其轉換為 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;
                    
        }

但我的期望是將兩張數據合並為一個 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
  }
]
}

任何人都可以幫助實現上述結果。 提前致謝。

我沒有閱讀您的代碼,因為我沒有將此代碼識別為創建 json(對不起,我的錯!)

使用代碼,如下所示,創建了這個 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"}}

使用此代碼jsonTotal1看起來與最終的 JSON 大致相同,而jsonTotal2已命名為 sheets。

注意:我知道我的數據與您的數據不同(結構也不同,因為我遺漏了工作表中的行)

代碼:

程序.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}");

工作表.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