繁体   English   中英

如何将具有嵌套属性的 json 转换为 c# 中的数据表

[英]How to convert a json with nested properties to data table in c#

如何使用 c# 以通用方式将具有嵌套属性的 Json 转换为DataTable以导出为 csv 文件。 样品 json 如下:

{
  "Length": {
    "Value": 12.93,
    "Unit": "m"
  },
  "Temperature": {
    "Value": 28.32,
    "Unit": "DegC"
  },
  "Color": "Blue"
}

我想在表格中展平如下:

"Property"    | "Value"  | "Unit"
---------------------------------
"Length"      | 12.93    | "m"
"Temperature" | 28.32    | "DegC"
"Color"       | "Blue"   | 

请注意, Color属性不是嵌套的,而LengthTemperature属性是嵌套的。 对于无单位属性(例如Color ),应将任何内容(或 null)添加到数据表中的“单位”列。

此外,嵌套属性主要是double类型,但可以包含任何struct类型。

将 JSON 转换为 DataTable的解决方案是我最接近的解决方案,但当然不适用于我拥有的嵌套属性。

你可以试试这段代码

    var jsonParsed = JObject.Parse(json);

    var jsonArr = new JArray();

    foreach (var prop in jsonParsed.Properties())
    {
        var jObj = new JObject { ["Property"] = prop.Name };

        var valueType = prop.Value.GetType().Name;

        if (valueType == "JValue")
        {
            jObj["Value"] = (string)prop.Value;
            jObj["Unit"] = string.Empty;
        }
        else if (valueType == "JObject")
        {
            var nestedProp = (JObject)prop.Value;
            jObj["Value"] = (string)nestedProp["Value"];
            jObj["Unit"] = nestedProp["Unit"];
        }

        jsonArr.Add(jObj);
    }
    DataTable dataTable = jsonArr.ToObject<DataTable>();

我最终通过创建一个DataTable并按如下方式填充它直接解决了它:

DataTable dataTable = new();

DataColumn[] dataColumns = new DataColumn[3];
dataColumns[0] = new DataColumn("Property");
dataColumns[1] = new DataColumn("Value");
dataColumns[2] = new DataColumn("Unit");

dataTable.Columns.AddRange(dataColumns);

JToken json = JToken.Parse(jsonContent);

foreach (JProperty content in json)
{
    DataRow row = dataTable.NewRow();

    row["Property"] = content.Name;

    if (content.Value.Type == JTokenType.Object)
    {
        row["Value"] = content.Value["Value"];
        row["Unit"] = content.Value["Unit"];
    }
    else
    {
        row["Value"] = content.Value;
        row["Unit"] = "-";
    }

    dataTable.Rows.Add(row);
}

暂无
暂无

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

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