2017-04-26 45 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;并依靠现有组件为您提供该翻译。