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

Dev*_*ata 2 python java json

我想python使用读取字典字符串java。示例字符串:

{'name': u'Shivam', 'otherInfo': [[0], [1]], 'isMale': True}
Run Code Online (Sandbox Code Playgroud)

这不是有效的 JSON。我希望使用代码将其转换为正确的JSONjava

zmo*_*zmo 5

好吧,最好的方法是通过一个 python 脚本传递它,该脚本读取该数据并输出有效的 json:

\n\n
>>> json.dumps(ast.literal_eval("{\'name\': u\'Shivam\', \'otherInfo\': [[0], [1]], \'isMale\': True}"))\n\'{"name": "Shivam", "otherInfo": [[0], [1]], "isMale": true}\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以你可以创建一个只包含以下内容的脚本:

\n\n
import json, ast; print(json.dumps(ast.literal_eval(sys.argv[1])))\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你可以将其设置为 python oneliner,如下所示:

\n\n
python -c "import sys, ast, json ; print(json.dumps(ast.literal_eval(sys.argv[1])))" "{\'name\': u\'Shivam\', \'otherInfo\': [[0], [1]], \'isMale\': True}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以从 shell 运行,这意味着您可以以相同的方式从 java 中运行它:

\n\n
String PythonData = "{\'name\': u\'Shivam\', \'otherInfo\': [[0], [1]], \'isMale\': True}";\n\nString[] cmd = {\n    "python", "-c", "import sys, ast, json ; print(json.dumps(ast.literal_eval(sys.argv[1])))",\n    python_data\n    };\nRuntime.getRuntime().exec(cmd);\n
Run Code Online (Sandbox Code Playgroud)\n\n

作为输出,您将得到一个正确的 JSON 字符串。

\n\n

这个解决方案是我能想到的最可靠的方法,因为它将安全地解析任何 python 语法而不会出现问题(因为它使用 python 解析器来执行此操作),而无需打开代码注入窗口。

\n\n

但我不建议使用它,因为你会为你解析的每个字符串生成一个 python 进程,这将是一个性能杀手。

\n\n

作为对第一个答案的改进,您可以使用一些 jython 在 JVM 中运行该 python 代码,以获得更高的性能。

\n\n
PythonInterpreter interpreter = new PythonInterpreter();\ninterpreter.eval("to_json = lambda d: json.dumps(ast.literal_eval(d))")\nPyObject ToJson = interpreter.get("to_json");\nPyObject result = ToJson.__call__(new PyString(PythonData));\nString realResult = (String) result.__tojava__(String.class);\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的内容未经测试(所以它很可能会失败并产生龙),我很确定你可以让它变得更优雅。它是根据这个答案松散改编的。我将留给您作为练习,了解如何将 jython 环境包含在 Java 运行时 \xe2\x98\xba 中。

\n\n
\n\n

PS:另一种解决方案是尝试使用巨大的正则表达式或多个正则表达式来修复您能想到的每种模式。但即使在更简单的情况下可能有效,我也会建议不要这样做,因为正则表达式对于这项工作来说是错误的工具,因为它的表现力不够,而且你永远不会全面。这只是为将来某个时候会杀死你的错误埋下种子的好方法。

\n\n
\n\n

PS2:每当您需要解析来自外部源的代码时,请始终确保数据经过清理且安全。永远不要忘记小鲍比桌

\n\n

\n