【问题标题】:How to get DataTable from JSON string that contains an empty array using JsonConvert?如何使用 JsonConvert 从包含空数组的 JSON 字符串中获取 DataTable?
【发布时间】: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 上确实收到了错误。

【问题讨论】:

    标签: c# json json.net deserialization json-deserialization


    【解决方案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报告,它将在未来的版本中修复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多