gpt4 book ai didi

json - Newtonsoft.JSON 使用 GUID 序列化\反序列化数据表

转载 作者:行者123 更新时间:2023-12-02 17:20:29 25 4
gpt4 key购买 nike

我有一个 Web API 解决方案,用于处理各种数据库。一切正常,直到我访问其中包含 GUID 编号的表。我最终将问题缩小到序列化/反序列化方法。当 DataTable 被序列化为 JSON,然后反序列化回 DataTable 时,包含 GUID 的列的数据类型变为 System.String 而不是像它那样的 System.Guid原来是。

举个简单的例子:

System.Data.DataTable myData = new DataTable();
myData.Columns.Add("ID", typeof(System.Guid));
myData.Columns.Add("Name", typeof(System.String));
myData.Rows.Add(System.Guid.NewGuid(), "Name1");

// Reports: System.Guid
System.Diagnostics.Debug.Write(myData.Columns["ID"].DataType.FullName);

string mySerializedString = Newtonsoft.Json.JsonConvert.SerializeObject(myData);
myData = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Data.DataTable>(mySerializedString);

// Reports: System.String
System.Diagnostics.Debug.Write(myData.Columns["ID"].DataType.FullName);

这是一个通用 API,所以我不知道传递的表是否包含包含 GUID 或任何其他可能导致 JSON 问题的数据类型的列。

希望这只是因为我遗漏了一些愚蠢的东西,而这只是一个简单的修复?

**** 更新 ****

感谢大家的指点。与此同时,我又遇到了另一个问题,这可能就是一切的终结。

当您最初从数据库中加载一个表时,每个行状态 = 未更改。然而,通过序列化过程,结果是每个行状态都变为“已添加”。

因此,以我查询 1 条记录为例,修改该记录并将其发回。 DataTable 现在将该记录标记为“已添加”,然后打破了主键约束并崩溃了。

这很糟糕!

我基本上是在两端寻找某种巨大的拼凑工作,我必须传递一个字典,其中包含我发现的所有属性,这些属性是通过 JSON 进程处理的,然后在另一端重建它。

所有这些都试图成为通用的并且不知道我应该处理什么样的数据。

&*(^% 它!

最佳答案

在 JSON 中无法指示某物是 GUID。
来自 json.org :

A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested.

因为您没有反序列化回具有已定义类型的内容,所以反序列化器无法知道它应该尝试将“GUID 作为字符串”转换回实际的 GUID。

如果您要反序列化回具有 GUID 类型属性的对象,它会尝试将字符串解析为该属性的 GUID,但数据表的结构不是传输的 JSON 的一部分。

关于json - Newtonsoft.JSON 使用 GUID 序列化\反序列化数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com