|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Столкнулся с проблемой при парсинге JSON строки Нужно забирать записи с тега "rows" и распределять его по колонкам с тега "column_order" Схема JSON: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Пробую парсить как-то так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Но это для другой схемы подходит .. В описании OPENJSON нет примера такой схемы как у меня Подскажите, пожалуйста, возможно ли вообще распарсить json-строку такой схемы как у меня возможностями OPENJSON или T-SQL в принципе? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2016, 16:42 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Другими словами, как распарсить такую JSON строку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
чтобы получить строки: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2016, 22:31 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
hulk77, Никогда с JSON не работал и не знаю является ли формат ваших JSON данных общепринятым (если да, то нужно курить хелп, которого много, наверняка МС предоставила какие-то более изящные средства для извлечения таких данных), но из чисто спортивного интереса к 2016 серверу вот это: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
выдает нужный вам результат: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2016, 23:18 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Это отлично подошло под задачу. Спасибо Вам большое за помощь Очень помогли ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2016, 13:28 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Вынужден снова просить вашей помощи.. Код: sql 1. 2. 3. 4. 5. 6. 7.
Этот запрос выполняется без ошибок Но когда используется OPENJSON, то при выполнении запросов с большим количеством символов в результате: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Возникает ошибка Сообщение 13609, уровень 16, состояние 4, строка 13 Текст JSON имеет неправильный формат. В позиции 1434569 найден непредвиденный символ ". Похоже что OPENJSON принимает только определенный лимит символов Можно как-то решить эту проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2016, 19:06 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Ага, а ваша функция и ваш веб ресурс прям на 100500 выдают валидный json, во всем виноват сервер. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2016, 19:45 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичАга, а ваша функция и ваш веб ресурс прям на 100500 выдают валидный json, во всем виноват сервер. Та конечно и http-сервер может отдавать с ошибкой А как можно отловить ошибку? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2016, 20:38 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичАга, а ваша функция и ваш веб ресурс прям на 100500 выдают валидный json, во всем виноват сервер. Проверил на другой таблице - режет посреди даты http://prntscr.com/dn4twm Похоже не в символах проблема а в их количестве.. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2016, 20:48 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
hulk77, Опять же, ни разу не эксперт по JSON, но в BOL есть функция ISJSON Например: Код: sql 1. 2. 3. 4. 5. 6. 7.
Результат: Код: sql 1. 2.
Проверяйте, что вам возвращается и далее по ситуации. П.С. Вообще, читайте хелп, к тому же в плане новых фичей он стал гораздо лучше. Набираешь в гугле "JSON t-sql", тебе сразу первой ссылкой (после рекламы): https://msdn.microsoft.com/ru-ru/library/dn921897.aspx А там: Общее описание Извлечение значений из текста JSON и их использование в запросах. Изменение значений JSON Преобразование коллекций JSON в набор строк OPENJSON Преобразуйте данные SQL Server в JSON или экспортируйте JSON Способы применения Возврат данных из таблицы SQL Server в формате JSON Анализ данных JSON с помощью запросов SQL Импорт данных JSON в таблицы SQL Server Загрузка файлов JSON в SQL Server Проверка встроенной поддержки JSON Дополнительные сведения о встроенной поддержке JSON Форматирование результатов запроса как JSON с помощью предложения FOR JSON (SQL Server) Преобразование данных JSON в строки и столбцы с помощью функции OPENJSON (SQL Server) Проверка, построение запросов и изменение данных JSON с помощью встроенных функций (SQL Server) Выражения пути JSON (SQL Server) Индексирование данных JSON Часто задаваемые вопросы о JSON в SQL Server Публикации блога Майкрософт Предложение FOR (Transact-SQL) (FOR JSON) OPENJSON (Transact-SQL) Функции JSON (Transact-SQL) ISJSON (Transact-SQL) JSON_VALUE (Transact-SQL) JSON_QUERY (Transact-SQL) JSON_MODIFY (Transact-SQL) И все с примерами, описанием - читай не хочу. Так что "пилите, Шура, пилите", в смысле читайте =) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2016, 22:31 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
SomewhereSomehow, как оказалось, это какая то проблема в самом sql server не смог ни обработать openjson и записать в nvarchar(max) и text всю json-строку - обрезает на каком-то примерно одинаковом участке, по разным таблицам источника пробовал на powershell выполнять http-запрос и записывать результат в файл, все отлично отработало Код: sql 1.
Код: sql 1.
JSON_string - nvarchar(max) То есть уже есть готовый результат правильной структуры json, в файле. sql server все равно обрезает длину строки Может кто сталкивался, можно чтото придумать или без вариантов? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2016, 03:12 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
hulk77пробовал на powershell выполнять http-запрос и записывать результат в файл, все отлично отработалоА попробовать из файла в openjson? Или будем читать молитву "sql server все равно обрезает длину строки"? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2016, 03:18 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
hulk77А как можно отловить ошибку? hulk77Возникает ошибка Сообщение 13609, уровень 16, состояние 4, строка 13 Текст JSON имеет неправильный формат. В позиции 1434569 найден непредвиденный символ ". В позиции 1434569 , Карл! Имеющий глазки да увидит! substring спасет-покажет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2016, 07:18 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
hulk77То есть уже есть готовый результат правильной структуры json, в файлеА чем вы проверили? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2016, 18:46 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевичhulk77пробовал на powershell выполнять http-запрос и записывать результат в файл, все отлично отработалоА попробовать из файла в openjson? Или будем читать молитву "sql server все равно обрезает длину строки"? Да, срезу и попробовал так. Поэтому и применял PowerShell В PowerShell http-запрос выполняется без проблем и формирует полноценную строку json А SQL Server не может прочитать Код: sql 1.
Поле JSON_string - NVARCHAR(MAX) http://prntscr.com/dnnuhn Код: sql 1.
Результат: Текст JSON имеет неправильный формат. В позиции 1838076 найден непредвиденный символ ". То есть не в функции на C# проблема, а оказалось, что в самом SQL server. Такое впечатление что на длину символов есть ограничение или оно срабатывает при записи или чтении с поля. Считывал функцией OPENJSON. Она возвращает ошибку что не полная строка, нарушена схема. То есть даже не в окне результата в SSMS, а даже при обращении в строке. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2016, 14:05 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
aleks2hulk77А как можно отловить ошибку? hulk77Возникает ошибка пропущено... В позиции 1434569 , Карл! Имеющий глазки да увидит! substring спасет-покажет. Не все так просто) В этой позиции просто обрывается json-строка в поле SQL Server'а Из разных таблиц истоника - в разных полях обрывается. но везде где-то на 4500-4700 символе по порядку (в Notepad++ считал) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2016, 14:07 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
alexeyvghulk77То есть уже есть готовый результат правильной структуры json, в файлеА чем вы проверили? В файл выгрузил результат http-запроса при помощи PowerShell Она и закрывается тегами ( http://prntscr.com/dnnvls), а в SQL Server попадает просто обрезанная строка То есть, вебсервер обрабатывает и возвращает правильно Это или CLR обрезает, или на уровне SQL Server'a.. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2016, 14:10 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
hulk77Это или CLR обрезает, или на уровне SQL Server'a..Так вы найдите, что приходит в SQL Server В OPENJSON что передаётся? Правильная строка? Как вы это проверяете? Вот у OPENJSON первый параметр: jsonExpression Is a Unicode character expression containing the JSON text. Он у вас какого типа? Unicode? Там полностью весь текст из файла? Он не исказился? У вас вопросы какие то абстрактные. Просто "не работает, ааа!" Вы даже своего кода не показываете, ошибок, ничего. Не описываете, что делаете, и что получаете. hulk77В этой позиции просто обрывается json-строка в поле SQL Server'аТак при чём тут OPENJSON? Первый этап - получить целиком строку в SQL, убедиться, что она считалась целиком, и не искажена. JSON не трогать, он пока ни при чём. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2016, 14:20 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
alexeyvghulk77Это или CLR обрезает, или на уровне SQL Server'a..Так вы найдите, что приходит в SQL Server В OPENJSON что передаётся? Правильная строка? Как вы это проверяете? Правы были в том что SQL пробует парсить ошибочный символ.. Только что изменит функцию на C# таким образом, чтобы результат возвращался не в SQL, а в текстовый файл. Выгружает правильную строку json Выполняю на SQL Server'e Код: sql 1. 2.
Результат: http://prntscr.com/dnrtrn Выполняю: Код: sql 1.
Результат с SSMS в текстовый файл. Все верно отработано То есть, OPENJSON просто посреди строки обрезает почему-то json-строку ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2016, 22:09 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Вот готовое решение: DLL с функциями отправки http-запроса, парсинга результата-json и запись в таблицу SQL Server Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.
На стороне SQL Server нужно выполнить: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Вызывать таким образом: Код: sql 1. 2. 3. 4. 5.
При подключении сборки в SQL Server в папке C:\DLL был такой перечень библиотек http://prntscr.com/dnuowc Проект библиотеки и нужные dll здесь http://dropmefiles.com/FcHPp ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 02:38 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
hulk77Результат с SSMS в текстовый файл. Все верно отработаноВы реально глазками файл проверяли? Или взяли таки к концу шестого дня и скормили промежуточный файл в любой другой парсер json? Еще select @@version так и не опубликовано. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 02:49 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
hulk77alexeyvgТак вы найдите, что приходит в SQL Server В OPENJSON что передаётся? Правильная строка? Как вы это проверяете? Правы были в том что SQL пробует парсить ошибочный символ.. А, то есть в OPENJSON передаётся неправильная строка (с ошибочным символом)? [quote hulk77]Выполняю: Код: sql 1.
Результат с SSMS в текстовый файл. Все верно отработано[quote hulk77]Не понял, "всё верно отработало" - это значит, что файл байт-в-байт такой же, как исходный текстовый? Или вы это не проверили? И в итоге, этот файл, который "с SSMS в текстовый файл" - он правильный? Его правильно обрабатывает парсер JSON? Какой парсер вы использовали для проверки, микрософтовский тоже использовали? hulk77То есть, OPENJSON просто посреди строки обрезает почему-то json-строкуЭто вообще непонятно. Как OPENJSON может "посреди строки обрезать"? Исходные данные же рид-онли, они не могут меняться. Вы точнее выражайтесь. Отладка - это проверка каждого этапа обработки, и вы должны быть уверены, что на конкретном этапе обработка прошла правильно, а не просто "программа не ругнулась". То есть вы должны проверить результат каждого этапа, получить формальное вещественное подтверждение этому, в виде распарсенной структуры JSON, контрольной суммы, корректной отработки программы проверки и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 10:41 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
alexeyvg Вы точнее выражайтесь. Отладка - это проверка каждого этапа обработки, и вы должны быть уверены, что на конкретном этапе обработка прошла правильно, а не просто "программа не ругнулась". То есть вы должны проверить результат каждого этапа, получить формальное вещественное подтверждение этому, в виде распарсенной структуры JSON, контрольной суммы, корректной отработки программы проверки и т.д. Не в коня корм. Тредстартеру следует освоить 1. Присваивание переменной. 2. Функцию Len(). 3. Функцию Substring(). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 11:28 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
[quot alexeyvg]hulk77пропущено... Это вообще непонятно. Как OPENJSON может "посреди строки обрезать"? Исходные данные же рид-онли, они не могут меняться. По идее может, если внутри Json'a есть одинарная кавычка ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 13:06 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
Andrey SribnyakalexeyvgЭто вообще непонятно. Как OPENJSON может "посреди строки обрезать"? Исходные данные же рид-онли, они не могут меняться. По идее может, если внутри Json'a есть одинарная кавычка"Обрезать строку" подразумевает, что есть область памяти, занятая строкой, и некая команда OPENJSON модифицирует область памяти. Но такого не происходит, OPENJSON не модифицирует передаваемый параметр с исходным JSON Я просто призвал ТС быть более точным, что бы было понятно, что он имеет в виду. Его мысль, как я могу догадаться, была такая: OPENJSON в процессе обработки строки с JSON останавливает обработку, не доводя её до конца. Наверное, так? Хотя я могу только предполагать. Это не придирки, программу нельзя отладить, и вообще нельзя быть программистом, рассуждая в стиле блондинки. В норме, как программа целиком, так и каждый её шаг, совершает некие однозначно определённые преобразования данных, которые можно однозначно проверить на правильность этих преобразований. И нужно точно описывать исходные данные, выполняемые действия, ожидаемый и фактический результаты, когда обращаешься к кому то за помощью или советом. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 22:51 |
|
Парсинг JSON
|
|||
---|---|---|---|
#18+
aleks2Тредстартеру следует освоить 1. Присваивание переменной. 2. Функцию Len(). 3. Функцию Substring().Ну, я уже предлагал 20046308 :-) ТС предпочитает долгий и трудоёмкий путь многократного запуска горы кода с внесением каждый раз нескольких случайных изменений. "Можно и за неделю, но тут помошник нужен (с)" ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 22:55 |
|
|
start [/forum/topic.php?fid=46&fpage=34&tid=1685089]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
97ms |
get tp. blocked users: |
2ms |
others: | 340ms |
total: | 523ms |
0 / 0 |