2017-04-26 382 views
1

我想使用java讀取python字典字符串。示例字符串:如何在JAVA中讀取python字典字符串

{'name': u'Shivam', 'otherInfo': [[0], [1]], 'isMale': True} 

這不是有效的JSON。我希望它使用java代碼轉換成適當的JSON

+5

有趣的任務。你的問題是什麼?我同意以下評論:爲什麼花精力來解析非標準格式;而不是確保你在python方面發出JSON呢?! – GhostCat

+0

由於這不是一個正確的JSON,所以我無法在JAVA中加載它。基本上我使用SCALA和json4s庫。 – Devavrata

+0

@GhostCat在我的情況下是不可能的。這些字符串保存在數據庫 – Devavrata

回答

3

好,最好的辦法是通過一個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:當你需要從外部來源解析代碼時,一定要確保數據已經過消毒和安全處理。永遠不要忘記小鮑比表

+0

這實際上很有意義 – Cruncher

+0

好的和直接的解決方案......我認爲與我的建議一起,它變得更有趣。任何反饋都歡迎... – GhostCat

+0

儘管我會謹慎從數據庫中取數據並將其推送到一個exec ... – Cruncher

1

在結合其他答案:這是直截了當地簡單地調用了Python的一行語句來「翻譯」蟒蛇快譯通字符串成標準JSON字符串。

但是爲數據庫中的每一行做一個新的Process可能會很快變成性能殺手。

因此有您應該考慮的最重要的是兩個選擇:

  • 建立保持運行一些小的「蟒蛇服務器」;它的唯一工作就是爲可以連接到它的JVM做翻譯
  • 你可以看看jython。含義:只需啓用JVM即可運行python代碼。換句話說:不是編寫你自己的python-dict-string解析器;你只需將「python的權力」添加到你的JVM;並依靠現有組件爲您提供該翻譯。