首页 文章

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

提问于
浏览
0

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

截图:

enter image description here

代码(更新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 HResult = 0x80131500 Message =读取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阅读器,数据表DT,JsonSerializer串行器)在Newtonsoft.Json.Converters.DataTableConverter.ReadJson(JsonReader读卡器,类型的objectType,对象existingValue,JsonSerializer串行器)在Newtonsoft.Json.Serialization . Newtonoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader,Type objectType,Boolean checkAdditionalContent)中的JsonSerializerInternalReader.DeserializeConvertable(JsonConverter转换器,JsonReader reader,Type objectType,Object existingValue),位于Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader,Type objectType) )at Newtonsoft.Json.JsonConvert.DeserializeObject(String value,Type type,JsonSerializerSetti) NGS设置)在Newtonsoft.Json.JsonConvert.DeserializeObject [T](字符串值,JsonSerializerSettings设置)在Newtonsoft.Json.JsonConvert.DeserializeObject [T](字符串值)

更新1:@ D-Shih我删除了col3之后的额外逗号以使"Json Parser"高兴但是,我仍然得到完全相同的异常 . 请注意,我在 test1 上没有收到任何错误,但我确实在 test2 上收到错误 .

enter image description here

1 回答

  • 0

    测试JSON数据的错误 . 在 col3 之后删除逗号

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

    代替

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

    我建议一个网站可以轻松检查JSON格式

    Json Parser

    EDIT

    我看到了 Json.net 源代码

    如果你想 JsonConvert.DeserializeObjectDataTable ,你不能给它 . 空 array

    在源代码上

    private static void CreateRow(JsonReader reader, DataTable dt)
    

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

    因此,您可以将数组作为空字符串 .

    看起来像这样 .

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

    c#online:https://dotnetfiddle.net/M6A3vE


    EDIT1

    这是一个问题,我向 JSON.Net 报告它将在未来版本中修复

    Fix error when deserializing empty array in DataTable

相关问题