1

我在包含 json 对象的用户表中有一个 JSON blob 列(例如 Groups),如下所示:

{Security:[1,5],Reporting:[2,8]}

如果我尝试使用 JSON_QUERY 查询该表,则会收到格式错误的错误。所以例如

SELECT JSON_QUERY([Groups],'$.Security') from User

退货

JSON 文本格式不正确。在位置 1 发现了意外的字符“S”。

原因是 SQL Server 中的 JSON blob 似乎坚持在对象属性上使用双引号。因此,如果上面的 JSON 看起来像这样(注意双引号),那么一切都很好。

{"Security":[1,5],"Reporting":[2,8]}

问题是我在 C# 应用程序中使用 ServiceStack,该应用程序基于预定义的用户 poco 自动构建此 JSON blob,并通过 API 直接插入数据库。当它按照 POCO 上预定义的方式插入此 JSON blob 时,它会自动插入它而不使用双引号。...像这样。

{Security:[1,5],Reporting:[2,8]}

现在,我在使用此数据的视图中使用(并且需要使用)的任何类型的 JSON_QUERY sql 再次失败。

任何人都可以在这里提出一种方法来处理这个问题或澄清为什么会发生这种情况。在 C# 代码和 SQL 服务器之间表示 JSON 数据的方式似乎存在不一致,这使其不兼容。

谢谢!

4

1 回答 1

3

ServiceStack 的Servicestack.Text JSON 序列化程序始终根据有效 JSON 的要求对属性进行双引号。

如果您正在谈论OrmLite 的复杂类型的 blob,默认情况下使用 ServiceStack 的JSV 格式序列化SQL Server,它使用 CSV 格式存储键和值,它只在需要时使用双引号。

OrmLite 的文档展示了如何根据 RDBMS 方言配置复杂类型序列化器,例如,您可以配置 SQL Server 以使用 JSON 序列化复杂类型:

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer();
于 2019-04-30T17:06:22.737 回答