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

时间:2018-07-06 21:34:58

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

(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:EndArray时出现意外的JSON令牌。路径'[0] .col2',第4行,位置12。     资料来源= Newtonsoft.Json     堆栈跟踪:      在Newtonsoft.Json.Converters.DataTableConverter.GetColumnDataType(JsonReader阅读器)      在Newtonsoft.Json.Converters.DataTableConverter.GetColumnDataType(JsonReader阅读器)      在Newtonsoft.Json.Converters.DataTableConverter.CreateRow(JsonReader reader,DataTable dt,JsonSerializer序列化器)处      在Newtonsoft.Json.Converters.DataTableConverter.ReadJson(JsonReader阅读器,类型objectType,对象existValue,JsonSerializer序列化器)处      在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter转换器,JsonReader阅读器,类型objectType,对象existingValue)中      在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader,Type objectType,Boolean checkAdditionalContent)中      在Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader,Type objectType)      在Newtonsoft.Json.JsonConvert.DeserializeObject(字符串值,类型,JsonSerializerSettings设置)      在Newtonsoft.Json.JsonConvert.DeserializeObject [T](字符串值,JsonSerializerSettings设置)      在Newtonsoft.Json.JsonConvert.DeserializeObject [T](String value)

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

enter image description here

1 个答案:

答案 0 :(得分:0)

测试JSON数据中的错误。删除col3

之后的逗号
 ""col3"": ""b2c172ea-e48c-4e20-9bee-3470278bd801""

代替

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

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

Json Parser

编辑

我看到了Json.net源代码

如果您想将JsonConvert.DeserializeObject设置为DataTable,则不能提供。空的array

关于源代码

private static void CreateRow(JsonReader reader, DataTable dt)

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

因此您可以将数组作为空字符串提供。

看起来像这样。

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