如何使用 JsonConvert 从包含空数组的 JSON 字符串中获取 DataTable?

Posted

技术标签:

【中文标题】如何使用 JsonConvert 从包含空数组的 JSON 字符串中获取 DataTable?【英文标题】:How to get DataTable from JSON string that contains an empty array using JsonConvert? 【发布时间】:2018-12-15 12:07:42 【问题描述】:

(Json.NET) JsonConvert.DeserializeObject<DataTable>() 适用于填充数组,但不适用于空数组([],,如我的示例所示:jsonString2 → col2)。我希望它默认创建一个 string[] 列,或者跳过,或者以其他方式避免异常。

截图:

代码(更新 1:在 col3 之后删除了多余的逗号,但仍然出现异常。):

[TestMethod]
public void TestSerializeEmptyArray()

    var jsonString1 = @"[
        
            ""col1"": ""bd3013bb-39a3-4704-b7c9-803c220f8abe"",
            ""col2"": [
            ""57ae6e0e-0c20-4da5-a246-b949c71ef551"",
            ""2bafe349-4b29-4161-814a-5a369459b78c""
                ],
            ""col3"": ""b2c172ea-e48c-4e20-9bee-3470278bd801""
        ]";
    var test1 = JsonConvert.DeserializeObject<DataTable>(jsonString1);

    var jsonString2 = @"[
        
            ""col1"": ""bd3013bb-39a3-4704-b7c9-803c220f8abe"",
            ""col2"": [],
            ""col3"": ""b2c172ea-e48c-4e20-9bee-3470278bd801""
        ]";
    var test2 = JsonConvert.DeserializeObject<DataTable>(jsonString2);

例外:

Newtonsoft.Json.JsonSerializationException H结果=0x80131500 消息 = 读取 DataTable 时出现意外的 JSON 令牌:EndArray。路径“[0].col2”,第 4 行,位置 12。 来源=Newtonsoft.Json 堆栈跟踪: 在 Newtonsoft.Json.Converters.DataTableConverter.GetColumnDataType(JsonReader 阅读器) 在 Newtonsoft.Json.Converters.DataTableConverter.GetColumnDataType(JsonReader 阅读器) 在 Newtonsoft.Json.Converters.DataTableConverter.CreateRow(JsonReader 阅读器,DataTable dt,JsonSerializer 序列化程序) 在 Newtonsoft.Json.Converters.DataTableConverter.ReadJson(JsonReader 阅读器,类型 objectType,Object existingValue,JsonSerializer 序列化程序) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter 转换器,JsonReader 阅读器,类型 objectType,对象现有值) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader 阅读器,类型 objectType,布尔 checkAdditionalContent) 在 Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader 阅读器,类型 objectType) 在 Newtonsoft.Json.JsonConvert.DeserializeObject(字符串值,类型类型,JsonSerializerSettings 设置) 在 Newtonsoft.Json.JsonConvert.DeserializeObject[T](字符串值,JsonSerializerSettings 设置) 在 Newtonsoft.Json.JsonConvert.DeserializeObject[T](字符串值)

更新 1:@D-Shih 我在 col3 之后删除了多余的逗号以使“Json Parser”满意,但是我仍然得到相同的异常。请注意,我在test1 上没有收到任何错误,但在test2 上确实收到了错误。

【问题讨论】:

【参考方案1】:

您的测试 JSON 数据中的错误。去掉col3后面的逗号

 ""col3"": ""b2c172ea-e48c-4e20-9bee-3470278bd801""

而不是

 ""col3"": ""b2c172ea-e48c-4e20-9bee-3470278bd801"",

我会推荐一个可以轻松检查 JSON 格式的网站

Json Parser

编辑

我看到了Json.net源代码

如果你想JsonConvert.DeserializeObjectDataTable,你不能给它。一个空的array

关于源代码

private static void CreateRow(JsonReader reader, DataTable dt)

有一部分代码Type columnType = GetColumnDataType(reader);获取json列类型,如果没有提供类型Json.net无法判断该数组的类型。

所以你可以将数组作为一个空字符串。

看起来像这样。

var jsonString2 = @"[

    ""col1"": ""bd3013bb-39a3-4704-b7c9-803c220f8abe"",
    ""col2"": [""""],
    ""col3"": ""b2c172ea-e48c-4e20-9bee-3470278bd801""
]";

c#在线:https://dotnetfiddle.net/M6A3vE


EDIT1

这是一个问题,我向JSON.Net报告它会在以后的版本中修复

Fix error when deserializing empty array in DataTable

【讨论】:

这并没有解决它。我删除了 col3 之后的额外逗号以使“Json Parser”高兴,但是我仍然得到相同的异常。请注意,我在test1 上没有收到任何错误,但在test2 上确实收到了错误。 (我在原始问题中添加了屏幕截图。) 我看到json.net源代码你可以看到我的编辑答案。 更新答案的问题是:虽然它确实成功获得了 string[] 的数据类型,但这样做的代价是需要“操纵”原始 json 并添加不正确的空数据字符串到生成的 DataTable。在我的示例中,col3 之后的额外逗号是一个粗手指,但空数组将是 api json 结果的预期不幸部分。 @StevenLyon 这是一个问题,我向JSON.Net报告,它将在未来的版本中修复

以上是关于如何使用 JsonConvert 从包含空数组的 JSON 字符串中获取 DataTable?的主要内容,如果未能解决你的问题,请参考以下文章

JsonConvert.DeserializeObject 返回空值

如何从数组中排除空数组?

如何使用 Jersey 将嵌套列表编组为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

JsonConvert.SerializeXmlNode() 为数组添加额外的子元素

如何格式化json数组

DataFrame 列(数组类型)包含 Null 值和空数组(len =0)。如何将 Null 转换为空数组?