【问题标题】:JSON format issues with JSON_QUERY and C#JSON_QUERY 和 C# 的 JSON 格式问题
【发布时间】:2019-09-19 07:16:55
【问题描述】:

我在包含如下 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 再次失败。

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

谢谢!

【问题讨论】:

  • 修复应用程序或联系供应商去看看json.org
  • JSON blobs in SQL server seem to insist on double quotes on the object attributes. 这就是规范定义 JSON 的方式。在任何系统中,属性键都必须有双引号才能成为有效的 JSON。
  • 必须引用 Json 键。阅读thisthat 了解详情。因此,您的应用程序没有创建一个有效的 Json 并且应该被修复。

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


【解决方案1】:

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

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

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

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer();

【讨论】:

  • 这很有帮助,将进行调查。谢谢
  • 这是一个很大的帮助。最后我不想改变这个全局变量,因为不确定它会在其他地方产生什么影响。因此,我在返回 toJSV() 的对象上创建了一个覆盖 toString() 并注册了该对象以进行序列化/反序列化,一切都很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多