JSON_QUERY和C#

时间:2019-04-30 15:21:09

标签: c# sql-server servicestack json-query

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

{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,该C#应用程序根据预定义的用户poco自动构建此JSON blob,并通过API直接插入到数据库中。当它按POCO上的预定义插入此JSON Blob时,它会自动插入不带双引号。

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

现在,在消耗该数据的视图中,我正在使用(并且需要使用)的任何JSON_QUERY sql再次失败。

任何人都可以在这里提出一种方法来解决此问题,或者澄清为什么会发生这种情况。在C#代码和SQL Server之间表示JSON数据的方式似乎不一致,这使该数据不兼容。

谢谢!

1 个答案:

答案 0 :(得分:3)

ServiceStack的Servicestack.Text JSON Serializer始终将有效JSON所需的属性用双引号引起来。

如果您谈论的是OrmLite's blobs for complex types,默认情况下是使用ServiceStack的JSV Format序列化的SQL Server,该服务器使用CSV格式存储键和值,并且仅在需要时才使用双引号。

OrmLite的文档显示了如何configure the Complex Type Serializer每个RDBMS方言,例如您可以将SQL Server配置为使用JSON通过以下方式序列化复杂类型:

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer();