java调用python,传参json字符串,含中文传参
java调用python,传参json字符串python脚本内容(test.py)# -*- coding: utf-8 -*-def main(input):return inputjava调用python方法/*** 调用python** @param fileUrlpython文件路径* @param method执行的python函数* @param pyObject json参数*
·
java调用python,传参json字符串
- python脚本内容(test.py)
# -*- coding: utf-8 -*-
def main(input):
return input
- java调用python方法
/**
* 调用python
*
* @param fileUrl python文件路径
* @param method 执行的python函数
* @param pyObject json参数
*
*/
public static PyObject callPythonByJson(String fileUrl, String method, PyObject pyObject){
if(method.trim().equals("")){
return null;
}
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile(fileUrl);
// 第一个参数为期望获得的函数的名字,第二个参数为期望返回的对象类型
PyFunction pyFunction = interpreter.get(method, PyFunction.class);
PyObject res=pyFunction.__call__(pyObject);
interpreter.close();
return res;
}
- 调用
public static void main(String[] arg){
String param="{\"name\":\"apple\",\n" +
"\"age\":12,\n" +
"\"grade\":[{\"math\":100}]}";
PyObject pyObject=new PyString(param);
//调用
PyObject result=callPythonByJson("D:\\test.py","main",pyObject);
System.out.println(result);
}
结果:
这里传入的是一个字符串,如果在python代码中得到json串的各个数据,就需要进行转换
- python字符串转json
res=json.loads(input) #json字符串转换成json
后续:
开发时用户只需要输入参数,编写函数就可以
参数的处理交给后台,但是java调用python传参的类型非常有限
这里的办法是在后台写一个转换脚本(jsonTransform.py)
# -*- coding: utf-8 -*-
import json
def main(input):
res=json.loads(input)
return res
test.py :
# -*- coding: utf-8 -*-
def main(input):
return input['name']
执行:
/**
* json从java到pythong格式转换
*
* @return PyObject
* @author liangqi
*/
public static PyObject jsonTransform(String json){
String fileUrl="D:\\jsonTransform.py";
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile(fileUrl);
// 第一个参数为期望获得的函数的名字,第二个参数为期望返回的对象类型
PyFunction pyFunction = interpreter.get("main", PyFunction.class);
PyString strJson=Py.newStringOrUnicode(json); //json串中含有中文会报错的处理方式
PyObject res=pyFunction.__call__(strJson);
interpreter.close();
return res;
}
public static void main(String[] arg){
String param="{\"name\":\"apple\",\n" +
"\"age\":12,\n" +
"\"grade\":[{\"math\":100}]}";
PyObject pyObject=jsonTransform(param);
PyObject result=callPythonByJson("D:\\test.py","main",pyObject);
System.out.println(result);
}
执行结果:
当参数中含有中文时:
参数字符串:
"{\"name\":\"苹果\",\n" +
"\"age\":12,\n" +
"\"grade\":[{\"math\":100}]}"
input的返回结果为:
(可以发现‘苹果’变为了编码,但是返回input[‘name’]时依然是‘苹果’)
原因是input返回的是json,而input[‘name’]返回的是字符串
这时候就需要添加判断对json进行解析:
/**
* 去除python转json里面的转义字符
*
* @return 字符串
* @author liangqi
*/
public static String formatPyJson(String str) {
String res = str;
res = res.replace(" ", "");
res = res.replace("{u'", "{'");
res = res.replace(":u'", ":'");
res = res.replace(",u'", ",'");
return res;
}
public static void main(String[] arg){
String param="{\"name\":\"苹果\",\n" +
"\"age\":12,\n" +
"\"grade\":[{\"math\":100}]}";
PyObject pyObject=jsonTransform(param);
//调用
PyObject result=callPythonByJson("D:\\test.py","main",pyObject);
//返回结果
String res=null;
try{
res = JSON.parse(PythonCall.formatPyJson(result.toString())).toString();
}catch (Exception e){
res =PythonCall.formatPyJson(result.toString());
}
System.out.println(res);
}
执行结果:
更多推荐
已为社区贡献1条内容
所有评论(0)