如何使用 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.DeserializeObject
为DataTable
,你不能给它。一个空的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?我得到一个空数组或一个包含数组的单元素字典数组