我有以下格式的json字符串

{
    "open": [
                3978,3856,3925,3918,3877.85,3992.7,4033.95,4012,3910,3807,3840,3769.5,3731,3646,3749,
                3770,3827.9,3851,3815.3,3791
            ],
    "high": [
            3978,3925,3929,3923,3977,4043,4041.7,4012,3920,3851.55,3849.65,3809.4,3733.4,3729.8,
            3758,3808,3864,3882.5,3824.7,3831.8
            ],
    "low":  [
            3861,3856,3836.55,3857,3860.05,3962.3,3980,3910.5,3811,3771.1,3740.1,3722.2,3625.1,
            3646,3721.4,3736.4,3800.65,3816.05,3769,3756.15
            ],
    "close": [
            3879.85,3915.9,3859.9,3897.9,3968.15,4019.15,3990.6,3914.65,3826.55,3833.5,3771.35,
            3769.9,3649.25,3690.05,3736.25,3800.65,3856.2,3824.6,3814.9,3779
            ],
    "volume":[
            3937092,1906106,3203744,6684507,3348123,3442604,2389041,3102539,6176776,3112358,     
            3258414,3330501,5718297,3143862,2739393,2105169,1984212,1960538,2307366,1919149
            ],
    "start_Time": [
            1326220200,1326306600,1326393000,1326479400,1326565800,1326825000,1326911400,
            1326997800,1327084200,1327170600,1327429800,1327516200,1327689000,1327775400,
            1328034600,1328121000,1328207400,1328293800,1328380200,1328639400
            ]
}

我还安装了Nuget Packege Newtonsoft.json

我试过密码了

var unwrappedJson = JsonConvert.DeserializeObject<string>(result);
DataTable dataTable = (DataTable)JsonConvert.DeserializeObject(unwrappedJson, (typeof(DataTable)));

但得到了一个错误

推荐答案

正如 comments 中提到的,您的JSON struct 是一个对象,其中每个字段都是一个值数组,它不支持反序列化为DataTable.

你需要将对象数据expand/transpose转换成一个对象数组(对不起,我不确定用哪个英文术语来描述比较合适).

[
  { "high": /* value */, "low": /* value */, ... }
]

对于实施摘要,您需要:

  1. 获取对象中包含字段(S)的列名(S).

  2. 通过字段数组中的值的数量来获取行数(假设所有字段都有相同的数字).

  3. 获取列数.

  4. 迭代每一行和每一列(索引)以通过索引获得各自的值,以形成每行的值array.

  5. 将数组加到DataRow.ItemArray中,将DataRow加到DataTable中.

public DataTable ExpandObjectToDataTable(JObject jObj)
{
    DataTable dt = new DataTable();

    if (jObj == null)
        return null;

    List<string> columns = jObj.Properties()
        .Select(x => x.Name)
        .ToList();

    // Add columns
    dt.Columns.AddRange(columns.Select(x => new DataColumn(x)).ToArray());

    var arrayValues = jObj.Values();
    // Get number of rows by calculating the number of values in the field
    int totalRow = arrayValues.Select(x => x.Count()).Max();
    int totalColumn = columns.Count;

    // Iterate row
    for (int i = 0; i < totalRow; i++)
    {
        DataRow row = dt.NewRow();
        List<object> values = new List<object>();

        // Iterate field
        for (int j = 0; j < totalColumn; j++)
        {
            values.Add(arrayValues.ElementAt(j).ElementAt(i));
        }

        row.ItemArray = values.ToArray();
        dt.Rows.Add(row);
    }       

    return dt;
}

呼叫者:

JObject jObj = JObject.Parse(json);
DataTable dt = ExpandObjectToDataTable(jObj);

Csharp相关问答推荐

在C# 11之前, struct 中的每个字段都必须显式分配?不能繁殖

C#中的包版本控制

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

. NET 8使用COM向VB6公开

无法解析数据库上下文的服务

在实时数据库中匹配两个玩家的问题

如何测量在使用UTF8而不是C#中的UTF16编码字符串时内存使用量的增长

在命名管道上使用GRPC ASP.NET核心时如何配置命名管道权限

当用户右键单击文本框并单击粘贴时触发什么事件?

在IAsyncEnumerable上先调用,然后跳过(1)可以吗?

DateTime ToString()未以指定格式打印

具有可空类型的C#NOTNULL约束具有意外行为

在被Interactive Server切换后,Blazor SSR页面无法正确加载JS

MSI无法将快捷方式添加到启动文件夹

{ or ; expected error如何解决此问题

两个DateTimeOffset之间的差异返回意外的负值

是否可以在Entity Framework Core中使用只读 struct 作为拥有实体?

解决方案:延长ABP框架和ANGING OpenIddict中的令牌生命周期

将两个for循环更改为一条LINQ语句

.NET6最小API:操作.MapGet之后的响应