2017-02-11 13 views
4

Я получаю CRAZY, пытаясь использовать Json Serializer/Deserializer в своей библиотеке классов и импортировать свою сборку в SQL Server.Как использовать Json Parser в процедуре CLR?

Я работаю с WebAPI, который отвечает строкой Json, и я хочу создать процедуру CLR Sql, которая вызывает этот API и использует результат api.

Я попробовал 2 способа Deserialize JSon строку:

1) System.Web.Script.Serialization

2) System.Runtime.Serialization.Json

Сначала один принеси мне эту ошибку:

Assembly 'system.web.extensions, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35.' was not found in the SQL catalog. (Microsoft SQL Server, Error: 6503)

И второе:

Assembly 'system.runtime.serialization, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.' was not found in the SQL catalog. (Microsoft SQL Server, Error: 6503)

Error ScreenShot

Есть ли способ разбора json в моей библиотеке классов?! (за исключением создания JSon/десериализации Serializer для моей личности в библиотеке классов !!!)

Visual Studio 2015 Сообщество, Microsoft SQL Server 2016 Developer

Спасибо заранее.

ответ

1

К сожалению, есть не существует метода, который является одновременно частью .NET Framework (т.е. встроенный) иSAFE.

Если вы хотите встроенный метод, то вы могли попробовать использовать DataContractJsonSerializer класс, который находится в System.Runtime.Serialization.Json пространство имен, которое, в свою очередь, нашел в System.Runtime. Serialization.dll. Вы можете найти пример использования здесь: How to: Serialize and Deserialize JSON Data.HOWEVER, чтобы использовать это внутри SQL Server, вам нужно будет импортировать System.Runtime.Serialization.dll, так как он не является одним из Supported .NET Framework Libraries. И потому, что он не поддерживается, это означает, что три вещи:

  1. Вы должны установить базу данных, содержащую Сборки для TRUSTWORTHY ON (из-за необходимости в PERMISSION_SET быть UNSAFE), то, что, как правило, советуют против из-за его риск для безопасности.
  2. Вы не можете быть уверены, что базовый код не делает что-то, что может вызвать «нечетное» поведение, такое как кеширование значений в переменных статического класса. SQLCLR использует один домен приложения для каждой комбинации Assembly-owner + Database. Следовательно, класс будет использоваться для всех сеансов, выполняющих этот код.

  3. Вы не можете быть гарантировано, что System.Runtime.Serialization.dll (или любой из его двух зависимых библиотек: System.ServiceModel.Internals и SMDiagnostics) не будет изменен в смешанном режиме DLL в будущем обновлении .NET Framework. В SQL Server допускаются только чистые библиотеки MSIL, поэтому, если любой из этих 3 когда-либо изменится, вместо этого будет «смешанным», тогда ваш код в SQL Server начнет сбой, и его не удастся исправить; вам придется перекодировать его. И это произошло раньше: System.ServiceModel стал смешанным режимом с выпуском .NET 4.0, поэтому код с его использованием работает в SQL Server 2005, 2008 и 2008 R2 (все связаны с CLR версии 2.0 и Framework версии 2.0 - 3.5), но не будет работать в SQL Server 2012 (все связаны с CLR версии 4.0 и Framework версий 4.0 и новее).

Но, если вы хотите попробовать, сделайте следующее (оно будет автоматически загружать 2 зависимые библиотеки DLL):

USE [someDB]; 

ALTER DATABASE CURRENT SET TRUSTWORTHY ON; 

CREATE ASSEMBLY [System.Runtime.Serialization] 
FROM 'C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll' 
WITH PERMISSION_SET = UNSAFE; 

ИЛИ, вы можете включать в себя код для разбора JSON в вашем проекте. У вас есть несколько вариантов здесь, а также:

  1. В то время как «предпочтительный» JSON парсер Json.NET, я не смог заставить его загрузить в качестве SAFE Ассамблеи. Прошло несколько лет с тех пор, как я попытался, но для кэширования значений использовалось довольно много переменных статического класса (помогает производительность, но не работает в общей среде), и я, кажется, вспоминаю, что он полагался на некоторые неподдерживаемые библиотеки (например, System.Runtime.Serialization).

  2. Я использовал JsonFx с некоторым успехом. Этот код также нуждался в некоторых обновлениях, чтобы заботиться о статических переменных класса, но это было возможно. Этот проект может обрабатывать преобразование из JSON в несколько разных разметки.

  3. Как уже упоминалось в ответе @ EvaldasBuinauskas, вы можете попробовать проект LitJSON. Я не пробовал этот проект, поэтому не знаю, как хорошо он работает. Похоже, что он немного меньше, чем проект JsonFX (не выполняет другие форматы), но на данный момент он имеет 25 нерешенных проблем, в то время как JsonFX имеет только 16.

    Возможно, вам стоит посмотреть на список «Проблемы «для обоих проектов, чтобы убедиться, что нет сообщений о том, что приведет к ошибке для вас.

+2

Код, который вы дали, работал, большое спасибо, но он предупредил, что сказал: если вы обновляете или обслуживаете эту сборку или .NET Framework, ваша программа интеграции CLR может перестать работать. Каково ваше предложение ? включить код для анализа JSON в вашем проекте? или продолжайте импортировать System.Runtime.Serialization? – Parsa

+1

@ Parsa Да, это «предупреждение» именно то, что я упомянул в пункте № 3 в верхнем разделе (с использованием ** ServiceModel ** в качестве примера). Учитывая, что JSON, как и XML, представляет собой текстовый формат, это просто вопрос его разбора (в отличие от необходимости использования ресурса, доступного только в библиотеках .NET Framework). Вот почему я использую JsonFX. Это не идеально, но он делает то, что мне нужно, с ассамблеей, обозначенной как «SAFE», а база данных - «TRUSTWORTHY OFF». Но если вам просто нужно это для одного или двух документов (не в общем смысле), тогда я напишу его вручную и сделаю с ним. –

+2

Я тоже использовал JsonFx, в то время как я хотел добавить JsonFx в сборки sqlserver, он дал мне эту ошибку: <<< CREATE ASSEMBLY не удалось, потому что тип «XmlInTransformer» в безопасной сборке «JsonFx» имеет статическое поле «DefaultObjectName». Атрибуты статических полей в безопасных сборках должны быть отмечены только в Visual C#, ReadOnly в Visual Basic или на языке Visual C++ и на промежуточном языке. >>> После этого я перехожу к источнику JsonFx и делаю эти атрибуты ReadOnly !!! И это работает, это правда ??? – Parsa

2

У меня была аналогичная проблема, посмотрите, как https://github.com/WCOMAB/SqlServerSlackAPI импортирует LitJSON в свой проект.

Ключевые файлы:

Вы можете принять подобный подход. Используя этот метод, мне не пришлось импортировать какой-либо другой экземпляр CLR для SQL Server.

Стоит упомянуть, что сборка должна быть небезопасной. Для того, чтобы развернуть его, вы будете иметь два варианта:

+2

Я установил свою базу данных TRUSTWORTHY on, и это уже дает мне ошибку. Согласно ссылкам GitHub, которые вы оставили, последний способ, которым я могу решить эту проблему, - создать парсер Json для себя? (с регулярным выражением или разделом и т. д.) – Parsa

+1

Вы также можете импортировать те библиотеки, которые упоминаются в сообщениях об ошибках, на сервер sql. –

+2

, когда я добавляю эту сборку, она дает мне эту ошибку: Assembly 'system.servicemodel.internals, не найден в каталоге SQL. Предупреждение: сборка system.runtime.serialization в Microsoft .NET Framework, которую вы регистрируете, не полностью протестирована в среде размещения SQL Server и не поддерживается. В будущем, если вы обновите или обслуживаете эту сборку или .NET Framework, ваша программа интеграции CLR может перестать работать. Пожалуйста, обратитесь к электронной документации по SQL Server для получения более подробной информации. (Microsoft SQL Server, Ошибка: 6503) – Parsa