2014-09-04 66 views
2

我的系統由一個C++主要部分組成,它作爲複雜進程的核心。該核心負責執行執行多項任務的Python腳本,然後在基於HTML技術的圖形用戶界面上顯示這些腳本。這個HTML文檔是使用WTL加載的,但是它並沒有那麼相關,因爲在python上生成的信息達到這一點之前,我的問題就出現了。關於在Python中生成一個好的JSON字符串

import json 
#my_python_dict is the Python dictionary information I want to send to C++ -> Javascript. 
json_str = json.JSONEncoder().encode(my_python_dict) 

然後我將此信息發送到C++使用適當的API調用: API_Call是執行並返回蟒生成的字符串的方法。

PyObject *json_string; 
json_string = API_Call(); 
char * c_str; 
c_str = PyString_AsString(json_string); 

如果我執行這些行我得到奇怪的字符和破碎的數據,而如果我替代原有代碼的Python爲這樣:

import json 
#my_python_dict is the Python dictionary information I want to send to C++ -> Javascript. 
#json_str = json.JSONEncoder().encode(my_python_dict). 
json_str = "This is a dummy test... of random lenght..." 

它工作得很好,所以我敢說問題可能出現在json.JSONEncoder()上,或者可能是json.JSONEncoder和PyString_AsString()中的編碼問題。

任何想法?

====================== P.D. ====================================

我一直在嘗試一些想法,試圖解決這個問題。

  • 最令人震驚的是:如果我只是從調試控制檯複製編碼的字符串,將其粘貼到虛擬字符串,然後返回該字符串,一切工作正常!但我確實需要json.JSONEncoder的輸出。
+0

您是否嘗試過在Python代碼中記錄'json_str'(或'my_python_dict')? – 2014-09-04 07:48:38

+0

是的,我做過。我甚至試圖從python控制檯打印json_string,並在控制檯中替換僞測試字符串作爲輸出,並且完美地工作。 – 2014-09-04 07:50:13

+0

https://docs.python.org/2/library/json.html#json.JSONEncoder 有一些關於轉義非ASCII字符的爭論。你有沒有嘗試改變這些選項? 你也試過使用json.dumps(my_python_dict)嗎? – gosom 2014-09-04 07:52:58

回答

1

轉換爲一個答案評論...

當你檢查的c_str內容?在使用c_str的內容之前,請確保由json.JSONEncoder().encode()創建的Python字符串對象尚未被釋放或以其他方式修改。