我想使用java
讀取python
字典字符串。示例字符串:如何在JAVA中讀取python字典字符串
{'name': u'Shivam', 'otherInfo': [[0], [1]], 'isMale': True}
這不是有效的JSON。我希望它使用java
代碼轉換成適當的JSON。
我想使用java
讀取python
字典字符串。示例字符串:如何在JAVA中讀取python字典字符串
{'name': u'Shivam', 'otherInfo': [[0], [1]], 'isMale': True}
這不是有效的JSON。我希望它使用java
代碼轉換成適當的JSON。
好,最好的辦法是通過一個python腳本讀取傳遞給它的數據和輸出有效的JSON:
>>> json.dumps(ast.literal_eval("{'name': u'Shivam', 'otherInfo': [[0], [1]], 'isMale': True}"))
'{"name": "Shivam", "otherInfo": [[0], [1]], "isMale": true}'
,所以你可以創建一個腳本,只包含:
import json, ast; print(json.dumps(ast.literal_eval(sys.argv[1])))
那麼你可以把它蟒蛇oneliner像這樣:
python -c "import sys, ast, json ; print(json.dumps(ast.literal_eval(sys.argv[1])))" "{'name': u'Shivam', 'otherInfo': [[0], [1]], 'isMale': True}"
,你可以從你的shell中運行,這意味着你可以用同樣的方式在java中運行它:
String PythonData = "{'name': u'Shivam', 'otherInfo': [[0], [1]], 'isMale': True}";
String[] cmd = {
"python", "-c", "import sys, ast, json ; print(json.dumps(ast.literal_eval(sys.argv[1])))",
python_data
};
Runtime.getRuntime().exec(cmd);
並且作爲輸出,你將擁有一個合適的JSON字符串。
這個解決方案是我能想到的最可靠的方式,因爲它可以安全地解析任何python語法而不會出現問題(因爲它使用python解析器來這樣做),而無需打開代碼注入窗口。
但我不會推薦使用它,因爲你會爲你解析的每個字符串產生一個python進程,這將是一個性能殺手。
作爲第一個答案的改進之處,您可以在JVM中使用some jython to run that python code以獲得更多性能。
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.eval("to_json = lambda d: json.dumps(ast.literal_eval(d))")
PyObject ToJson = interpreter.get("to_json");
PyObject result = ToJson.__call__(new PyString(PythonData));
String realResult = (String) result.__tojava__(String.class);
以上是未經測試(所以它可能會失敗併產卵龍),我敢肯定,你可以使它更優雅。它從this answer鬆散地改編。我將留給你作爲練習,以瞭解如何在Java運行時中包含jython環境。
P.S:另一種解決方案是試圖解決您能想到用正則表達式巨大或多個的每一個模式。但即使在更簡單的情況下可能有效,我也會建議不要這樣做,因爲正則表達式對於工作來說是錯誤的工具,因爲它不會表現出足夠的表現力,而且永遠不會全面。這只是種植一顆種子的好方法,它會在未來某個時候殺死你。 P.2:當你需要從外部來源解析代碼時,一定要確保數據已經過消毒和安全處理。永遠不要忘記小鮑比表
有趣的任務。你的問題是什麼?我同意以下評論:爲什麼花精力來解析非標準格式;而不是確保你在python方面發出JSON呢?! – GhostCat
由於這不是一個正確的JSON,所以我無法在JAVA中加載它。基本上我使用SCALA和json4s庫。 – Devavrata
@GhostCat在我的情況下是不可能的。這些字符串保存在數據庫 – Devavrata