项目场景:

window java 调用python脚本传递json字符串json.loads()格式化异常问题。

问题描述:

json:

{
	"name": "ccc",
	"pwd": "cc",
	"age": 12
}

java:

String info = "{\"name\":\"ccc\",\"pwd\":\"cc\",\"age\":12}";
String arguments = "python" + " " + "E:\\myPython\\src\\python\\test2.py" + " " + info;
try {
    Process process = Runtime.getRuntime().exec(arguments);
    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
    String line = null;
    while ((line = in.readLine()) != null) {
        System.out.println(line);
    }
    in.close();
    int re = process.waitFor();
    System.out.println(re);
} catch (Exception e) {
    e.printStackTrace();
}

python:

if __name__ == '__main__':
    info = sys.argv[1]
    try:
        print(json.loads(info) )
    except Exception as e:
        print(e)

result:

Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

原因分析:

windows环境中在传递参数的时候, 引号没有被作为参数的一部分传递给脚本,在脚本中接收到的参数是:

{name:ccc,pwd:cc,age:12}

解决方案:

对入参json中的引号进行转义, 使其成为字符串的一部分:

{\"name\":\"ccc\",\"pwd\":\"cc\",\"age\":12}

即在代码中这样:

String info = "{\\\"name\\\":\\\"ccc\\\",\\\"pwd\\\":\\\"cc\\\",\\\"age\\\":12}";

在脚本中接收到的为:

{"name":"ccc","pwd":"cc","age":12}

总的来说在win环境中使用Java调用python比较麻烦!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐