Проблемы с форматом JSON в JSON_QUERY и C # - PullRequest
1 голос
/ 30 апреля 2019

У меня есть столбец BLSON JSON (например, Группы) в пользовательской таблице, которая содержит объект json следующим образом:

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

Если я попытаюсь запросить эту таблицу с помощью JSON_QUERY, я получу плохо отформатированную ошибку. Так, например,

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

Возвращает

Текст JSON неправильно отформатирован. Неожиданный символ 'S' находится в позиции 1.

Причина в том, что BLOB-объекты JSON в SQL-сервере, похоже, настаивают на двойных кавычках в атрибутах объекта. Так что если вышеприведенный JSON выглядит следующим образом (обратите внимание на двойные кавычки), то все в порядке.

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

Проблема в том, что я использую ServiceStack в приложении C #, которое автоматически создает этот BLOB-объект JSON на основе предварительно определенного пользовательского документа и вставляет его непосредственно в БД через API. Когда он вставляет этот BLOB-объект JSON, как предопределено в POCO, он автоматически вставляет его без двойных кавычек. ... вот так.

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

Теперь еще раз любой вид JSON_QUERY sql, который я использую (и должен использовать) в представлениях, которые используют эти данные, не работает.

Может ли кто-нибудь предложить здесь подход, чтобы разобраться с этим или каким-то разъяснением того, почему это будет происходить. Кажется, существует несоответствие в том, как данные JSON представлены между кодом C # и сервером SQL, что делает их несовместимыми.

Спасибо!

1 Ответ

3 голосов
/ 30 апреля 2019

ServiceStack Servicestack.Text JSON Serializer всегда заключает в свойства двойные кавычки, как требуется для действительного JSON.

Если вы говорите о BLOB-объектах OrmLite для сложных типов , которые сериализуются с использованием JSV-формата ServiceStack по умолчанию для SQL Server, который хранит ключи и значения в формате CSV, который использует только двойные -квот при необходимости.

Документы OrmLite показывают, как вы можете настроить Сериализатор сложного типа для диалекта СУБД, например. Вы можете настроить SQL Server для сериализации сложных типов, используя JSON с:

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer();
...