Текст JSON неправильно отформатирован. Неожиданный символ '' 'найден в позиции 1 - PullRequest
0 голосов
/ 06 октября 2019

Вопрос: Почему я не могу применить функцию OPENJSON для считывания данных ниже в стандартную столбцовую форму? Как я могу изменить запрос или текст JSON для решения этой проблемы?

Контекст: У меня есть некоторые данные JSON в глобальной временной таблице в SQL Server, которые я пытаюсь проанализировать и загрузить в стандартную таблицу.

SELECT * FROM ##json_loop_tracking;

Возвращает данные одной строки в следующей структуре:

{'sends': 0, 'opens': 0, 'clicks': 0, 'forwards': 0, 'unsubscribes': 0, 'bounces': 0, 'spam_count': 0}

При попытке применить функцию OPENJSON в блоке кода ниже я получаю следующую ошибку:

Сообщение 13609, уровень 16, состояние 4, строка 51 Текст JSON неправильно отформатирован. Неожиданный символ '' 'находится в позиции 1.

INSERT INTO ##jsonparsed_tracking (
sends,opens,clicks,forwards,unsubscribes,bounces,spam_count
)
SELECT DISTINCT
jsn.sends, jsn.opens, jsn.clicks, jsn.forwards, jsn.unsubscribes, jsn.bounces,jsn.spam_count
FROM ##json_loop_tracking
OUTER APPLY (

SELECT * FROM OPENJSON(##json_loop_tracking.my_json)
WITH (
    sends int '$.sends',
    opens int '$.opens',
    clicks int '$.clicks',
    forwards int '$.forwards',
    unsubscribes int '$.unsubscribes',
    bounces int '$.bounces',
    spam_count int '$.spam_count'
)

) AS jsn

1 Ответ

1 голос
/ 06 октября 2019

Одинарные кавычки, как и ваши данные, не соответствуют JSON. Однако вы все равно можете использовать его, если замените его двойными кавычками (если все ваши данные будут такими):

>>> a = "{'sends': 0, 'opens': 0, 'clicks': 0, 'forwards': 0, 'unsubscribes': 0, 'bounces': 0, 'spam_count': 0}"

>>> import json
>>> json.loads(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python37\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "C:\Program Files\Python37\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Program Files\Python37\lib\json\decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Это другой модуль и другое выражение, но в основном та же ошибка. Мы исправляем это следующим образом:

>>> json.loads(a.replace("'", '"'))
{'sends': 0, 'opens': 0, 'clicks': 0, 'forwards': 0, 'unsubscribes': 0, 'bounces': 0, 'spam_count': 0}

Обратите внимание, что я использовал a.replace("'", '"'), чтобы исправить проблему, это может завершиться ошибкой, если ваши данные содержат более сложные объекты

...