您的位置:首页 > 移动开发 > Android开发

Android--Jsonrpc4j的使用

2016-06-22 08:39 661 查看
转载请声明地址:http://blog.csdn.net/skyunicorn/article/details/51731605

jsonrpc4j调用的库有三个(jsonrpc4j.jar  、jsonrpc4j-sources.jar 、jsonrpc4j-javadoc.jar)

jsonrpc4j下载地址:http://download.csdn.net/detail/skyunicorn/9555833

但是调用jsonrpc4j的时候还要依赖三个包(好麻烦,我当时用的时候不知道,结果搞这个都要奔溃了)

(另外我在这吐槽一下:CSDN文章审批太慢,而且传个jar包,竟然让我传了3-4次,搞什么啊)

jackson-annotations.jar  http://download.csdn.net/detail/skyunicorn/9556107

jackson-core-.jar  http://download.csdn.net/detail/skyunicorn/9556128

jackson-databind.jar  http://download.csdn.net/detail/skyunicorn/9556110

使用方法:

一、导包

具体步骤就不说了

二、具体使用

//连接服务器
JsonRpcHttpClient client = new JsonRpcHttpClient(new URL(path)); // path为URL

//设置传递对象
Map<String, String> login = new HashMap<String, String>();
login.put("db",db); //db为参数
login.put("login",user); //user为参数
login.put("password", pwd); //pwd为参数

//调用方法连接(invoke(method,object,returnType))
Map map = client.invoke("method", login, Map.class);

获取返回对象的session_id

if (SessionID == "")
{
JSONObject jsonObject = new JSONObject(map);//此处的JSONObject为org.json包下的

SessionID = jsonObject.optString("session_id");
Log.d("SessionID", SessionID);
}


以上便登录成功了。

我们再调用其他方法试下:

前面我们登录后,拿到了session_id,后面的方法调用需要用到

// 连接URL并设置SessionID
JsonRpcHttpClient client = new JsonRpcHttpClient(new URL(path));
// 设置头部传SessionID
Map<String, String> headers = new HashMap<String, String>();
headers.put("Session_ID", SessionID); // 请咨询后台的SessionID名
client.setHeaders(headers);
// 设置连接超时
client.setConnectionTimeoutMillis(5000);
client.setReadTimeoutMillis(5000);


我们看下后台需求的格式:

{
'model':'aaaa'
'method':'bbbb'
'args':[[1]]
'kwargs': {'fields': ['id', 'name']}
}

根据需求我们设置传参

//整体对象
Map<String, Object> map = new HashMap<String, Object>();
//model传值
map.put("model", "aaaa");
//method传值
map.put("method", "bbbb");

//设置args里的列表(就是这里坑了我好久)
List argsList = new ArrayList();
List itemList = new ArrayList();
itemList.add(1);
argsList.add(itemList);
//args传值
map.put("args", argsList);

//定义kwargs里的对象
Map<String, Object> kwargsMap = new HashMap<>();
//设置kwargs里的列表
List kwargsList = new ArrayList();
kwargsList.add("id");
kwargsList.add("name");
//设置kwargs里的对象
kwargsMap.put("fields", kwargsList);
//kwargs传值
map.put("kwargs", kwargsMap);

//发送请求:(获取数据类型转为List)
List list = client.invoke("method", map, List.class); //第一个参数是方法名,请咨询后台

// 将获取的数据转为JSONArray
JSONArray array = new JSONArray(list);
// 遍历jsonArray转为jsonObject
for (int i = 0; i < array.length(); i++)
{
JSONObject object = array.getJSONObject(i);
Log.d(TAG, object.toString());
String name = object.optString("name");
}


// 出现LinkedHashMap转JsonObject出错情况时,将JsonArray强转为LinkedHashMap然后取值
Log.d(TAG, "array---" + ((LinkedHashMap)array.get(0)).get("name").toString());

暂时搞了这么多,谁有更简单的方法,请留言让我学习下,谢谢。

Demo因为涉及公司URL就不提供了,主要代码都贴上了。

注:我后来尝试下,发现将数据转为JSONObject再取值会更方便(2016.9.26修改)

    在bulid里添加Gson库

compile 'com.google.code.gson:gson:2.2.4'

然后取值

Object object = client.invoke("method", map, Object.class);

    Gson gson = new Gson();

    JSONObject jsonObject = new JSONObject(gson.toJson(object));

然后直接按Json格式取值就可以

感谢 燕智凯 提供的依赖地址(2017.1.20修改)

compile 'com.github.briandilley.jsonrpc4j:jsonrpc4j:1.5.0'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android