Проблемы с форматом JSON с JSON_QUERY и C #

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

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

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

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

Возврат

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

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

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

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

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

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

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

Спасибо!


person Gotts    schedule 30.04.2019    source источник
comment
Исправьте приложение или обратитесь к поставщику, чтобы просмотреть json.org.   -  person Salman A    schedule 30.04.2019
comment
JSON blobs in SQL server seem to insist on double quotes on the object attributes. Так определяется спецификацией JSON. Ключи атрибутов должны иметь двойные кавычки, чтобы JSON был действительным в любой системе.   -  person    schedule 30.04.2019
comment
Ключи Json должны быть указаны в кавычках. Прочтите это и это, чтобы узнать подробности. Поэтому ваше приложение не создает действительный Json и должно быть исправлено.   -  person Zohar Peled    schedule 30.04.2019


Ответы (1)


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

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

В документации OrmLite показано, как можно настроить сериализатор комплексного типа для RDBMS Dialect, например вы можете настроить SQL Server для сериализации сложных типов с помощью JSON с помощью:

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer();
person mythz    schedule 30.04.2019
comment
Это полезно, займусь расследованием. Спасибо - person Gotts; 30.04.2019
comment
Это было большим подспорьем. В конце концов, я не хотел изменять эту глобальную переменную, так как не уверен, какой эффект она окажет где-либо еще. Итак, я создал переопределение toString () для моего объекта, который возвращает toJSV (), и зарегистрировал объект для сериализации / десериализации, и все в порядке !! - person Gotts; 30.04.2019