如何在JAVA中读取python字典字符串

时间:2017-04-26 12:31:20

标签: java python json

我想使用console.log(a1.getId() === a2.getId() && a1.getName() === a2.getName() && a1.getPercentage() === a2.getPercentage()) // true 阅读python字典字符串。示例字符串:

java

这不是有效的JSON。我希望它使用{'name': u'Shivam', 'otherInfo': [[0], [1]], 'isMale': True} 代码转换为正确的 JSON

2 个答案:

答案 0 :(得分: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])))

然后你就可以把它变成像这样的python 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.S.2:每当您需要解析外部源代码时,请始终确保数据已清理且安全。永远不要忘记小桌子

答案 1 :(得分:1)

与另一个答案相关:只需调用python one-liner语句就可以将python-dict-string“转换”为标准的JSON字符串。

但是,为数据库中的每一行执行一个新的Process可能会很快变成性能杀手。

因此,您应该考虑两个选项:

  • 建立一些继续运行的小“python服务器”;它唯一的工作就是为可以连接它的JVM进行翻译
  • 您可以查看jython。含义:只需启用JVM即可运行 python 代码。换句话说:而不是编写自己的python-dict-string解析器;你只需将“python powers”添加到你的JVM中;并依靠现有的组件为您进行翻译。