如何在C#中通用地将含嵌套属性的JSON转为DataTable用于CSV导出
在C#中通用转换带嵌套属性的JSON到DataTable
要实现将带嵌套属性的JSON转换为目标结构的DataTable,我们可以借助**Newtonsoft.Json(Json.NET)**的JObject来灵活遍历和解析JSON结构,核心思路是区分顶层属性的类型(嵌套对象/普通值),分别填充DataTable的行。
步骤说明
- 先定义DataTable的结构,包含
Property、Value、Unit三列,其中Value列用object类型兼容任意值类型,Unit列允许为空。 - 将JSON字符串解析为JObject,遍历每个顶层属性。
- 对每个属性值进行判断:
- 若为嵌套对象(JTokenType.Object),提取其
Value和Unit属性值; - 若为普通值(如字符串、数字等),直接将值存入
Value列,Unit列设为DBNull.Value。
- 若为嵌套对象(JTokenType.Object),提取其
完整代码示例
首先需要安装Newtonsoft.Json NuGet包:
Install-Package Newtonsoft.Json
转换方法代码:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Data; public static class JsonConverterHelper { public static DataTable ConvertNestedJsonToDataTable(string json) { // 初始化DataTable并定义列 var dataTable = new DataTable(); dataTable.Columns.Add("Property", typeof(string)); dataTable.Columns.Add("Value", typeof(object)); dataTable.Columns.Add("Unit", typeof(string)); // 解析JSON为JObject var jsonObject = JObject.Parse(json); foreach (var property in jsonObject.Properties()) { var row = dataTable.NewRow(); row["Property"] = property.Name; if (property.Value.Type == JTokenType.Object) { // 处理嵌套结构,提取Value和Unit字段 var nestedObject = (JObject)property.Value; row["Value"] = nestedObject["Value"]?.ToObject<object>(); row["Unit"] = nestedObject["Unit"]?.ToObject<string>(); } else { // 处理普通值类型,Unit列设为空 row["Value"] = property.Value.ToObject<object>(); row["Unit"] = DBNull.Value; } dataTable.Rows.Add(row); } return dataTable; } }
使用示例
针对你提供的示例JSON,调用方法如下:
var sampleJson = @" { ""Length"": { ""Value"": 12.93, ""Unit"": ""m"" }, ""Temperature"": { ""Value"": 28.32, ""Unit"": ""DegC"" }, ""Color"": ""Blue"" }"; DataTable resultTable = JsonConverterHelper.ConvertNestedJsonToDataTable(sampleJson); // 后续可使用CsvHelper等库将DataTable导出为CSV文件
注意事项
- 该方法支持任意类型的嵌套
Value(包括double、int、自定义struct等),ToObject<object>会自动完成类型转换; - 如果嵌套对象存在其他额外属性,当前逻辑仅提取
Value和Unit,如需扩展可修改嵌套对象的处理逻辑; - 非嵌套属性的
Unit列会被设为DBNull.Value,导出CSV时会显示为空单元格,符合需求。
内容的提问来源于stack exchange,提问作者Francois Louw
相关产品推荐
相关产品推荐

