![](/img/trans.png)
[英]How to convert Multiple Json object to DataTable or DataSet in C#
[英]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.