我想使用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