JSON文本格式不正确。在位置1

时间:2019-10-06 07:58:35

标签: python sql json sql-server open-json

问题::为什么我无法应用OPENJSON函数将下面的数据读取为标准列形式?如何修改查询或JSON文本来解决此问题?

上下文:我试图解析并加载到标准表中的SQL Server全局临时表中有一些JSON数据。

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 个答案:

答案 0 :(得分:1)

像数据一样,单引号也不是正确的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("'", '"')来解决此问题,如果您的数据包含更复杂的对象,则可能会失败