1. 程式人生 > >java之--把jython得到的基本資料型別轉換成Java資料型別

java之--把jython得到的基本資料型別轉換成Java資料型別

今天,給大家介紹下如何在java用jython的方法得到Python資料並把它轉換為java下資料型別.下面我們進入正題:

我們使用的jython的jar包版本為2.70,然後在引入jar包jythonutils1.0

例如下面是之前只用jython2.70常用方法:

import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

/**
 * 在java中呼叫本機python指令碼中的函式
 * 
 * @author liuyazhuang
 *
 */
public class FirstJythonScript {
	
	public static void main(String args[]) {
		PythonInterpreter interpreter = new PythonInterpreter();
		interpreter.execfile("D:/Workspaces/J2EE/Test/config/my_utils.py");
		PyFunction func = (PyFunction) interpreter.get("adder", PyFunction.class);

		int a = 2010, b = 6;
		PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
		System.out.println("anwser = " + pyobj.toString());

	}
}
但是有個問題我們怎麼精確的得到PyObject類包裝的Python資料並轉換成java資料呢:

先引入測試的test.py檔案,我是把它直接放在src下的

#coding='utf-8'
def fun1(*argv):
	return {i==argv[0]:i for i in argv}
def fun2(a, b):
	return a+b
def fun3(*argv):
	return [i for i in argv]
def fun4():
	return '你好,jython世界!'
#print('hello jython!')

先看個引入jythonutils1.0後的簡單例子:

1.

@Test
	public void fun5() throws Exception{//.py檔案執行
		JythonUtils.execPyFile("src/text.py");
	}
2.
@Test
	public void fun4() throws Exception{//python的string轉java的string
		PyObject object = JythonUtils.execPyFunction("src/text.py", "fun4");
		String str= (String)JythonUtils.toObjectFromPyObject(object);
		System.out.println(JythonUtils.encoding(str));
	}
執行結果: 

你好,jython世界!

3.

@Test
	public void fun3() throws Exception{//python的list轉java的list
		List l = new ArrayList();
		l.add(1);
		l.add("100");		
		PyObject object = JythonUtils.execPyFunction("src/text.py", "fun3",1,2,"hello!",l);
		List list= (List)JythonUtils.toObjectFromPyObject(object);
		System.out.println(list);
		System.out.println(list.get(2));
		System.out.println(((List)list.get(3)).get(1));
	}
執行結果:

[1, 2, 'hello!', [1, '100']]
hello!
100

4.

@Test
	public void fun2() throws Exception{//python的int轉java的int
		PyObject object = JythonUtils.execPyFunction("src/text.py", "fun2",1,2);
		int n= (Integer)JythonUtils.toObjectFromPyObject(object);
		System.out.println(n);
	}
執行結果:

3

5.

@Test
	public void fun1() throws Exception{//python的dict轉java的map
		PyObject object = JythonUtils.execPyFunction("src/text.py", "fun1",1,"haha");
		Map map= (Map)JythonUtils.toObjectFromPyObject(object);
		System.out.println(map);
		System.out.println(map.get(true));
	}
執行結果:

{False: 'haha', True: 1}
1

注:這裡我執行的都是用Junit的@Test方式
在這裡jythonutils包裝了一些簡單的操作

像只執行.py檔案的話執行

JythonUtils.execPyFile("檔名")
執行.py中的方法
PyObject object = JythonUtils.execPyFunction("檔名", "函式名",引數1,引數2,,...);//這裡是可變引數
Object o = JythonUtils.toObjectFromPyObject(object);
將o強轉為自己需要的java資料型別以Map為例:
Map map= (Map) o;
若在轉String型別碰到中文亂碼情況可以嘗試使用:
String str= (String)JythonUtils.toObjectFromPyObject(object);
JythonUtils.encoding(str);

jython2.7jar包下載連結http://download.csdn.net/detail/l1028386804/9464731

jythonutils1.0包下載連結http://download.csdn.net/detail/zq18239961260/9848466

jython2.70常用方法連結:http://m.blog.csdn.net/article/details?id=50915556