有没有人知道如何让json.dumps正确编码包含正则表达式的字符串?或者,如果有一种替代方法来编码JSON有效负载的数据,该数据库没有使用能正确处理此问题的json.dumps吗?
例如:
import json
MyString = 'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"'
data = {}
data['MyString'] = MyString
data['date'] = '2017-09-18T11:28:06'
json_data = json.dumps(data)
print json_data
将生成:
{
"date": "2017-09-18T11:28:06",
"MyString": "regex \"Network\\sInformation:[\\s\\S]+?Workstation\\sName:\t+(?<src_host>[^\r]+)\""
}
但是,您注意到[^\r]
未正确转义,应为[^\\r]
,由API处理会导致解析错误。
最后,我在这里构建的JSON有效负载将使用请求提交给Web API,类似于:
requests.post(url, auth=(uname, passwd), data=json_data, headers=headers)
注意:我已经考虑过简单地创建一个函数来发出一堆替换命令来自己手动编码,这是我目前的计划B,但我希望已经有一个解决方案/模块在那里我可以利用这个。
答案 0 :(得分:1)
您的正则表达式定义存在缺陷,而不是JSON输出:
>>> MyString = 'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"'
>>> MyString[-5:-4]
'\r'
>>> len(MyString[-5:-4])
1
>>> print(MyString[-5:-4]) # produces an empty line
您定义了回车符,而不是单独的反斜杠和r
字符; Python将这两个解释为转义序列。然后JSON编写了回车符\r
:
>>> import json
>>> chr(13) # ASCII code 13 is a carriage return
'\r'
>>> print(json.dumps(chr(13)))
"\r"
改为使用原始字符串文字:
MyString = r'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"'
现在您有两个单独的字符\
和r
:
>>> MyString = r'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"'
>>> MyString[-6:-4]
'\\r'
>>> len(MyString[-6:-4])
2
>>> print(MyString[-6:-4])
\r
并且这两个字符产生您期望的JSON输出:
>>> import json
>>> print(json.dumps(MyString))
"regex \"Network\\sInformation:[\\s\\S]+?Workstation\\sName:\\t+(?<src_host>[^\\r]+)\""