2017-10-16 47 views
-1

有誰知道一種方法來讓json.dumps正確地編碼一個包含正則表達式的字符串嗎?或者,如果有一種替代方法來編碼JSON有效載荷的數據,而JSON有效載荷不會使用能夠正確處理這種情況的json.dumps?當字符串包含正則表達式時,Python編碼特殊的JSON字符?

例如:

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,但我希望已經有一個解決方案/模塊在那裏,我可以利用它來做到這一點。

回答

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]+)\"" 
+1

doh !!!謝謝!這是非常有意義的,一切都是正確的世界。 – user3246693

相關問題