spring学习笔记---第三方SDK(Rest API)和Jaskson的巧用
前言:
其实我以前一直不懂电商, 以及电商中所涉及的业务概念. 对于SKU等名词, 觉得有些玄乎. 对其背后的数据模型, 也有莫名的未知恐惧感: 庞大而理不清头绪. 不过最近有机会接触了微商(有赞), 身体力行, 感觉加深了一些了解. 对之前一直谈到的店铺ISV, 也明白其的工作内容.
有赞(口袋通)做得真心的赞, 不过其java版的sdk, 始终觉得有些粗糙. 比如其返回结果是裸json字符串, 对于javaer而言, 习惯了pojo, 直接处理之还是显得有些麻烦, 因此我们需要在此基础上, 再做点额外的工作.
本篇文章, 将结合这个例子, 来讲解下jaskson的妙用.
相关文章:
一. Jackson的使用和定制.
这篇文章, 主要是服务端中, jackson库是如何扮演重要的角色. 本文是着重讲述, 在服务调用方, jackson是如何起到相应的作用的.
吐槽:
有赞API在线文档说明, 官方网址: http://open.koudaitong.com/doc.
JAVA版SDK的Sample样例分析:
public class KDTApiTest {
private static final String APP_ID = "app_id"; //这里换成你的app_id
private static final String APP_SECRET = "app_secret"; //这里换成你的app_secret /*
* 测试获取单个商品信息
*/
private static void sendGet(){
String method = "kdt.item.get";
HashMap<String, String> params = new HashMap<String, String>();
params.put("num_iid", "2651514");
KdtApiClient kdtApiClient;
HttpResponse response;
try {
kdtApiClient = new KdtApiClient(APP_ID, APP_SECRET);
response = kdtApiClient.get(method, params);
System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = bufferedReader.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
从简单的sample代码中, 可以发现其ApiClient是对HttpClient做个一个简单的封装, 但封装并不彻底, 调用时和结果响应处理都有些麻烦.
我大致猜测其结果为何就返回一个json字符串, 让解析的工作留给平台开发者. 不是懒, 而是因为返回结果的变动可能性比较大, 不敢轻易定制为对应的POJO类对象.
返回的JSON字符串如下所示:
{"response":{"item":{"cid":5000000,"promotion_cid":0,"tag_ids":"58279885","skus":[{"num_iid":105744782,"sku_id":35872379,"sku_unique_code":"10574478235872379", "quantity":"9999","outer_id":""}, ...
注: 顶级元素为response, item对应具体的商品信息.
无论如何, json的解析工作, 还是省不了的, 那如何处理呢?
可以引入JSONObject, 按json字符串的层次结构来处理, 比如如下所示:
JSONObject root = JSONObject.fromString(jsonText);
JSONObject item = root.getJSONObject("response").getJSONObject("item");
注: 这种编写方式, 非常的繁琐, 一点也不利于程序的快速处理, 那是否有利器来解决该问题呢? 我们的大英雄--jackson, 即将出马.
解决方案:
针对上述例子的kdt.item.get接口, 定义相应的POJO类.
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName("response")
public class KdtItemGetResult { @JsonProperty("item")
private GoodsDetailVO item; public GoodsDetailVO getItem() {
return item;
} public void setItem(GoodsDetailVO item) {
this.item = item;
}
}
注: POJO类, @JsonRootName可以设定Root元素, 用于剥离最外层, @JsonProperty用于设定对应json的key和属性的映射关系, @JsonIgnoreProperties(ignoreUnknown=true), 用于挑选需要的元素, 避开因为没有对应的pojo类属性而报错.
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoodsDetailVO {
@JsonProperty("num_iid")
private long numIid;
@JsonProperty("alias")
private String alias;
@JsonProperty("title")
private String title;
}
注: 其自然支持类层次结构的映射转换.
那么, 我们在继续修改下调用接口, 如下所示:
public KdtItemGetResult kdtItemGet(long numIid) { String method = "kdt.item.get";
HashMap<String, String> params = new HashMap<String, String>();
params.put("num_iid", "" + numIid); KdtApiClient kdtApiClient;
HttpResponse response; try {
kdtApiClient = new KdtApiClient(APP_ID, APP_SECRET);
response = kdtApiClient.get(method, params);
// System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = bufferedReader.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString()); String jsonText = result.toString();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
KdtItemGetResult kigr = objectMapper.readValue(jsonText, KdtItemGetResult.class); return kigr;
} catch (Exception e) {
// e.printStackTrace();
}
return null;
}
注: 除了请求的处理, 依旧如前, 但对json转换为pojo的处理, 变得非常的简洁.
其核心的代码就如下几句:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); // 支持@JsonRootName的特性
KdtItemGetResult kigr = objectMapper.readValue(jsonText, KdtItemGetResult.class);
return kigr;
当然rest api的调用, 有可能失败, 再在外层添加下TResult<T>的封装即可.
public class TResult<T> {
private boolean success = false;
private int errCode = 0;
private String errMsg = "OK";
private T value = null;
}
如你所看到的, 封装处理就非常的方便, 借用一句广告词: 妈妈, 再也不用担心粗糙的第三方SDK了.
总结:
尽量让优秀的框架, 替你做繁琐的重复工作. 这是一个非常重要的提高工作效率的方式. 临近结笔, 发现写得虎头蛇尾, 权做笔记.
公众号&游戏站点:
个人微信公众号: 木目的H5游戏世界
spring学习笔记---第三方SDK(Rest API)和Jaskson的巧用的更多相关文章
- Spring学习笔记2——表单数据验证、文件上传
在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...
- 不错的Spring学习笔记(转)
Spring学习笔记(1)----简单的实例 --------------------------------- 首先需要准备Spring包,可从官方网站上下载. 下载解压后,必须的两个包是s ...
- Java架构师之路 Spring学习笔记(一) Spring介绍
前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...
- Spring学习笔记(一)
Spring学习笔记(一) 这是一个沉淀的过程,大概第一次接触Spring是在去年的这个时候,当初在实训,初次接触Java web,直接学习SSM框架(当是Servlet都没有学),于是,养成了一个很 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- 【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面
作者:ssslinppp 异常处理请参考前篇博客:<[Spring学习笔记-MVC-15]Spring MVC之异常处理>http://www.cnblogs.com/sssl ...
随机推荐
- NSArray和NSDictionary的混合
- jsm使用
参考:http://blog.csdn.net/robinjwong/article/details/38820259
- redis sort
redis sort命令用法 1.命令描述返回或保存给定列表.集合.有序集合key中经过排序的元素.排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较. 2.一般sort用法最简单的sort ...
- 再谈IT行业工程师文化
为什么是再呢?因为“工程师文化”这种说法网上很多,各种理解,各种版 本,我只是简单说说我的认识,说的不对的地方敬请各位大牛,高手,高高手多多指教,我本身也是个技术人员,不过只是技术不怎么样而已.写这个 ...
- 动态链接库dll键盘钩子后台记录代码示例
//.header #ifndef _DLLHOOK_H_ #define _DLLHOOK_H_ #include <windows.h> #define DLL_EXPORT_FUN ...
- ubuntu 防火墙 添加策略 解决mysql远程访问问题
ubuntu 的iptables 文件不在 init.d中 不能 service iptables restart 只修改 /etc/iptables 文件也不管用 sudo iptables -L ...
- IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果
问题描述: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树 ...
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(三)
最近写了个Matlab程序,好慢呐……所以开始学习Matlab与C/C++混合编程.下面写了个测试代码,显示一个Double类型矩阵中的元素. 源代码 #include "mex.h&quo ...
- SharePoint安全 - SharePoint网站常用页面URL索引
博客地址 http://blog.csdn.net/foxdave 一. 主要网站内容 首页 /default.aspx /Pages/default.aspx 网站设置 /_layouts/sett ...
- AFNetworking3.0概述
最近一直在研究iOS网络开发,对NSURLSession套件进行了深入研究,作为iOS开发者,熟悉苹果的原生技术,可以在不需要第三方框架的情况下进行网络开发,也更有利于从底层了解iOS网络请求的原理, ...