【问题标题】:Convert Json string to DataTable将 Json 字符串转换为 DataTable
【发布时间】:2022-03-30 18:34:06
【问题描述】:

我正在尝试将 Json 转换为 DataTable。将 jsonArray 转换为 DataTable 时我发现成功。然而,当转换一个 json 字符串时(下):

var r = {'ASSOCIATION_ID':61.0,'DESCRIPTION':'fssESTf64 - false','ACTIVE':true,'MODEL_TYPE':'0','SEARCH_TYPE':'false','CREATED_BY':'1090323','CREATED_DATE':'2015-09-17T14:41:20','LAST_UPDATED_BY':'1090323','LAST_UPDATED_DATE':'2016-02-26T15:55:54'}

我收到错误消息 {"Unexpected JSON token when reading DataTable. Expected StartArray, got StartObject. Path '', line 1, position 1."}

我的代码很简单:

DataTable a = JsonConvert.DeserializeObject<DataTable>(r);

请帮忙。

【问题讨论】:

  • "Expected StartArray" 意味着该函数需要一个对象数组,而不是单个对象。
  • 您似乎可以访问要返回的数据。为什么不直接序列化一个包含这些数据的 DataTable?
  • A DataTable 序列化为包含键/值对的对象数组,如下所示:Serialize a DataSet。您的 JSON 是单个对象。你想要什么 - DataTable 一行?

标签: c# asp.net .net json.net


【解决方案1】:

您的根 JSON 容器是一个对象(由大括号包围的逗号分隔键/值对的无序集合 - {})。 Json.NET 将DataTable 序列化为对象的数组(由方括号[] 包围的逗号分隔标记的有序集合),每一行都有一个数组条目,如Serialize a DataSet 所示。 IE。以下可以反序列化为数据表:

[
  {
    "ASSOCIATION_ID": 61.0,
    "DESCRIPTION": "fssESTf64 - false",
    "ACTIVE": true,
    "MODEL_TYPE": "0",
    "SEARCH_TYPE": "false",
    "CREATED_BY": "1090323",
    "CREATED_DATE": "2015-09-17T14:41:20",
    "LAST_UPDATED_BY": "1090323",
    "LAST_UPDATED_DATE": "2016-02-26T15:55:54"
  }
]

因此,您的 JSON 无法通过 Json.NET 自动映射到 DataTable

如果需要,您可以将 JSON 对象反序列化为带有一行的 DataTable。为此,将其加载到中间 JToken 中,检查它是否是对象而不是数组,如果是,则将其包装在数组中,然后反序列化:

var token = JToken.Parse(r);

if (token.Type == JTokenType.Object)
    token = new JArray(token);

var a = token.ToObject<DataTable>();

【讨论】:

  • 谢谢,我可以在前后添加“[”和“]”并使用 JArray 本身进行转换,对吗?
  • 我想你甚至可以使用JsonConvert.DeserializeObject&lt;DataTable&gt;("[" + r + "]");,但首先检查r 是数组还是对象比假设它不是数组更安全。
  • 是的,我通过检查来做到这一点。还有一个好处,有没有办法解析包含特殊字符的json,如?,#,...请协助。
  • 我已经为此发布了一个单独的问题:stackoverflow.com/questions/36550246/… 请协助。
猜你喜欢
  • 2015-06-16
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2012-10-06
  • 1970-01-01
相关资源
最近更新 更多