【问题标题】:c# Convert from dynamic object (that has been converted from a JSON string) back into a DataTablec# 从动态对象(已从 JSON 字符串转换)转换回 DataTable
【发布时间】:2019-12-09 17:00:50
【问题描述】:

我正在循环遍历动态对象的集合,每个对象从其他地方的 DataTable 开始,然后转换为 Json,然后 Json 转换为动态对象,现在我想将其转换回 DataTable。

JSON 看起来像这样:

[
{
    "TRS_KEY": 1716,
    "TRS_PTR": 54,
    "PLUID": 9314807005306,
    "Ext11": false,
    "Subtract": false,
    "Cancel": false,
    "Negative": false,
    "FuelItemCancel": false,
    "StaffDiscAllow": true,
    "PriceOveride": false,
    "OnSale": false,
    "WSPriceOverride": false,
    "ManPrice": false,
    "ManPriceAllw": false,
    "NoManWgnt": false,
    "WgtItem": false,
    "DecItem": false,
    "Gallons": false,
    "ChainPrv": false,
    "NonMerch": false,
    "StoreCpn": false,
    "VendorCpn": false,
    "DiscAlw": true,
    "Scan": false,
    "ReadSrv": null,
    "NextInfo": false,
    "ReplUnknown": false,
    "GSTExclFollow": false,
    "PriceGrid": false,
    "DepID": 1070,
    "MSU": 1,
    "RetnID": 0,
    "TaxF": 16,
    "QTY": 1,
    "Price": 8,
    "Amount": 8,
    "ExclPrice": 8,
    "ExclAmount": 7.27,
    "CaseQty": false,
    "TailFlags": 0,
    "NoStockDeduct": false,
    "NoLoyaltyPoints": false
}

]

方法如下:(dynamicTatble是保存JSON数据的动态对象)

foreach (dynamic dynamicTable in dynMessage.SourceData)
                    {
                        context.Logger.Log($"table -> {dynMessage.TableReference.IncludedTables[tableIndex].ToString()} outer -> {dynamicTable}");

                        string s = JsonConvert.SerializeObject(dynamicTable);
                        DataTable dt = (DataTable)JsonConvert.DeserializeObject(s, (typeof(DataTable)));
                        context.Logger.LogLine($"DataTableRows={dt.Rows.Count}");

                        tableIndex++;
                    }

我正在尝试从动态转换为 JSON 字符串,然后将 JSON 字符串转换为 DataTable,但出现以下错误:

发生了一个或多个错误。 (无法反序列化当前的 JSON 数组(例如 [1,2,3])转换为“System.Data.DataTable”类型,因为 类型需要一个 JSON 对象(例如 { "name": "value" } ) 正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 { "name": "value" }) 或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、 IList),例如可以从 JSON 数组反序列化的 List。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。路径'',第 1 行,位置 1。): System.Threading.Tasks.Task.Wait 处的 AggregateException(Int32 毫秒超时,CancellationToken 取消令牌)在 lambda_method(Closure, Stream, Stream, LambdaContextInternal)

在 lambdaS2CProcessMessage.Function.FunctionHandler(SQSEvent evnt, ILambdaContext 上下文)在 C:\Users\jmatson\Source\Repos\AWS-S2C-ProcessMessage\lambdaS2CProcessMessage\Function.cs:line 154

【问题讨论】:

  • 我认为日志是不言自明的。当它需要一个对象时,您正在传递一个要转换的数组..
  • yip - 这不是我以前见过的任何 json
  • 废话,我刚刚注意到括号......所以它只是在转换为 DataTable 时引用数组索引的情况吗?

标签: c# json datatable


【解决方案1】:

你应该试试这个。您做错的事情是您正在尝试将对象数组转换为单个对象。您应该从您的 Json 字符串中删除开始和结束 [ ]

foreach (dynamic dynamicTable in dynMessage.SourceData)
{
    context.Logger.Log($"table -> {dynMessage.TableReference.IncludedTables[tableIndex].ToString()} outer -> {dynamicTable}");

    string s = JsonConvert.SerializeObject(dynamicTable);
    s = s.Trim().TrimStart('[').TrimEnd(']');

    DataTable dt = (DataTable)JsonConvert.DeserializeObject(s, (typeof(DataTable)));
    context.Logger.LogLine($"DataTableRows={dt.Rows.Count}");

    tableIndex++;
}

或者,如果您的数据将是某物的列表,那么只需将其转换为某物的列表..List<Something> 喜欢:

var dat = JsonConvert.DeserializeObject<List<Something>>(s);

【讨论】:

  • 谢谢。所以我猜这个 JSON 有时是否可以包含多个数组元素(在我的示例中它只有一个,但有些将包含多个数组元素)那么我应该使用您的第二个示例吗?
  • @JamesMatson No. Json 可以包含一个对象,或者一个对象数组,但不能包含多个数组。
  • @JamesMatson,如果这回答了您的问题,请将其标记为正确答案..
  • 我还没有测试代码,一旦我完成了测试,如果它解决了问题,我当然会将问题标记为已回答。
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多