JSONObject,JSONArray,JSONString之间转换问题

最近,我在做一个视频上传功能,其中一个需求是:待视频上传成功之后需要获取当前视频的时长,由于我们的视频是放在第三方平台上,所以我们需要调用第三方平台接口来获取我想要的数据,API如下:

接口名称:批量获取视频的时长和大小

接口URL

http://api.polyv.net/v2/video/{userid}/info

接口说明

获取多个视频的时长和大小

请求方式

GET

支持格式

JSON

请求参数

参数名必选类型及范围说明
vidstruestring多个视频ID(逗号分割)
signtruestring签名,40位大写的sha1值
ptimetruestring当前13位毫秒级时间戳,3分钟内有效
formatfalsestring默认返回json格式,如果format=xml返回xml格式
jsonpfalsestring例如,正常情况{error:0,data:””},加 jsonp=a后返回a({error:0,data:””})

JSON返回

{
    "code": 200, 
    "status": "success", 
    "message": "success", 
    "data": [
        {
            "vid": "2d939377c23a37d2b0a2428006755627_2", 
            "duration": "00:09:40", 
            "filesize1": 9714032, 
            "filesize2": 9415768
        }, 
        {
            "vid": "2d939377c23ebcfe8b4ff3dadcabfbbf_2", 
            "duration": "00:00:14", 
            "filesize1": 574357, 
            "filesize2": 1092671
        }
    ]
}

返回错误json

{
    "code": 400, 
    "status": "error", 
    "message": "sign can not be empty.", 
    "data": ""
}

PHP示例代码

<?php
$userid="2d939377c2";
$vids="2d939377c23a37d2b0a2428006755627_2,2d939377c23ebcfe8b4ff3dadcabfbbf_2";
$ptime=time()*1000;
$secretkey="3OmoLbTlHu";
$str="ptime=$ptime&vids=$vids".$secretkey;
$sign=strtoupper(sha1($str));
$url="http://api.polyv.net/v2/video/$userid/info?ptime=$ptime&sign=$sign&vids=$vids";
$content = file_get_contents($url);
echo $content;
?>

签名规则:

将非空的请求参数按照参数名字典顺序排列,连接参数名与参数值,并在尾部加上secretkey,生成40位大写SHA1值,作为sign。 以下是示例过程:

  • 请求参数为
"ptime" = "1493344799000"
"vids" = "2d939377c23a37d2b0a2428006755627_2,2d939377c23ebcfe8b4ff3dadcabfbbf_2"
  • 将请求参数按照参数名字典顺序排列
"ptime" = "1493344799000"
"vids" = "2d939377c23a37d2b0a2428006755627_2,2d939377c23ebcfe8b4ff3dadcabfbbf_2"
  • 连接字符串

连接参数名与参数值,并在尾部加上secretkey(secretkey的值为3OmoLbTlHu),如下:

ptime=1493344799000&vids=2d939377c23a37d2b0a2428006755627_2,2d939377c23ebcfe8b4ff3dadcabfbbf_23OmoLbTlHu
  • 生成签名sign
66A7000F442DB7D701533C69F44053521D17C7D0

看完以上信息之后,我自己将PHP代码改造成Java代码,得到的接口如下所示:

Controller类

/**
	 * 获得视频时长
	 * @param request
	 * @param vid
	 * @return
	 */
	@RequestMapping("/getVideoDurationFromPolyv")
	@ResponseBody
	public Map<String,Object> getVideoDurationFromPolyv(HttpServletRequest request,@RequestParam("vid") String vid){
		Map<String, Object> json = new HashMap<String, Object>();
		try {
			String duration = "";
			if (vid != null && !"".equals(vid)){
				duration = PolyvTokenUtil.getPolyvDuration(request, vid);
				if(duration!=null&&!"".equals(duration)){
					json=this.setJson(true, "OK", duration);
				}else{
					json=this.setJson(false, "抱歉,由于您的网速太差导致获取视频时长失败,请点击“清空”按钮后再重新上传!", null);
				}
			}else{
				json=this.setJson(false, "参数vid错误!", null);
			}
		} catch (Exception e) {
			logger.error("PolyvTokenController.getPreviewDurationFromPolyv()--error", e);
			this.setAjaxException(json);
		}
		return json;
	}

PolyvTokenUtil类

   /**
	 * 获取视频时长
	 * @param request
	 * @param vid
	 * @return
	 */
	public static String getPolyvDuration(HttpServletRequest request,String vid){
		try {
			String userId = "123456"; // polyv 提供的服务器间的通讯验证
			String secretkey = "123456"; // polyv 提供的接口调用签名访问的key
			String ptime = ""+System.currentTimeMillis(); // 时间戳
			String str="ptime="+ptime+"&vids="+vid+secretkey;
			String sign=SecuritySHA1Utils.shaEncode(str).toUpperCase();
			String url="http://api.polyv.net/v2/video/"+userId+"/info";
			String param="ptime="+ptime+"&sign="+sign+"&vids="+vid;
			String result=sendGet(url,param);
			System.out.println("1:-------"+result);
			JSONObject jsonObject = JSONObject.parseObject(result);
			System.out.println("2:-------"+jsonObject);
			if(jsonObject.get("data")!=null&&!"".equals(jsonObject.get("data"))){
				String result1=jsonObject.get("data").toString();
                                System.out.println("3:-------"+result1);
				Map<?, ?> map = JSON.parseObject(result1, Map.class);
				if(map.get("duration")!=null&&!"".equals(map.get("duration"))){
					return map.get("duration").toString();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

    public static String sendGet(String url, String param) {
		String result = "";
		BufferedReader in = null;
		try {
			String urlNameString = url + "?" + param;
			URL realUrl = new URL(urlNameString);
			// 打开和URL之间的连接
			URLConnection connection = realUrl.openConnection();
			// 设置通用的请求属性
			connection.setRequestProperty("accept", "*/*");
			connection.setRequestProperty("connection", "Keep-Alive");
			connection.setRequestProperty("user-agent",
					"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			// 建立实际的连接
			connection.connect();
			// 获取所有响应头字段
			/*Map<String, List<String>> map = connection.getHeaderFields();
			// 遍历所有的响应头字段
			for (String key : map.keySet()) {
				System.out.println(key + "--->" + map.get(key));
			}*/
			// 定义 BufferedReader输入流来读取URL的响应
			in = new BufferedReader(new InputStreamReader(
					connection.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
		} catch (Exception e) {
			System.out.println("发送GET请求出现异常!" + e);
			e.printStackTrace();
		}
		// 使用finally块来关闭输入流
		finally {
			try {
				if (in != null) {
					in.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return result;
	}

Js代码:

            $.ajax({
				url: '${ctx}/polyv/getVideoDurationFromPolyv',
				type: 'post',
				data: {
					'vid': vid
				},
				success: function(result) {
					if(result.success == true) {
						if(result.entity != null &&
							result.entity != "") {
							//视频时长
							var time = result.entity;
							alert(time);
							$("#time-sc").val(time);
							return true;
						}
					} else {
						alert(result.message);
						return false;
					}
				},
				error: function(res) {
					alert("抱歉,系统繁忙,请稍后再试!" + res);
					return false;
				}
			});

运行结果如下所示:

1:-------{"code":200,"status":"success","message":"success","data":[{"vid":"b5dd6d8e214aeab5dc374fbdae5dec0e_b","duration":"00:00:15"}]}
2:-------{"message":"success","status":"success","data":[{"duration":"00:00:15","vid":"b5dd6d8e214aeab5dc374fbdae5dec0e_b"}],"code":200}
3:-------[{"duration":"00:00:15","vid":"b5dd6d8e214aeab5dc374fbdae5dec0e_b"}]
com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 1, json : [{"duration":"00:00:15","vid":"b5dd6d8e214aeab5dc374fbdae5dec0e_b"}]
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:222)
	at com.alibaba.fastjson.parser.deserializer.MapDeserializer.deserialze(MapDeserializer.java:58)
	at com.alibaba.fastjson.parser.deserializer.MapDeserializer.deserialze(MapDeserializer.java:39)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:642)

以上错误大概是“数据不是json格式,转化失败!”,根据第三条的打印结果我们也能看出数据格式确实不是json格式的,而后我又把PolyvTokenUtil类里面的getPolyvDuration()改为如下:

   /**
	 * 获取视频时长
	 * @param request
	 * @param vid
	 * @return
	 */
	public static String getPolyvDuration(HttpServletRequest request,String vid){
		try {
			String userId = "123456"; // polyv 提供的服务器间的通讯验证
			String secretkey = "123456"; // polyv 提供的接口调用签名访问的key
			String ptime = ""+System.currentTimeMillis(); // 时间戳
			String str="ptime="+ptime+"&vids="+vid+secretkey;
			String sign=SecuritySHA1Utils.shaEncode(str).toUpperCase();
			String url="http://api.polyv.net/v2/video/"+userId+"/info";
			String param="ptime="+ptime+"&sign="+sign+"&vids="+vid;
			String result=sendGet(url,param);
			System.out.println("1:-------"+result);
			JSONObject jsonObject = JSONObject.parseObject(result);
			System.out.println("2:-------"+jsonObject);
			if(jsonObject.get("data")!=null&&!"".equals(jsonObject.get("data"))){
				String result1=jsonObject.get("data").toString();
				System.out.println("3:-------"+result1);
				result1=result1.replace("[", "");
				result1=result1.replace("]", "");
				//序列化为JSON字符串
				String result2 = JSON.toJSONString(result1);
				System.out.println("4:-------"+result2);
				//通过 replace去掉斜杠
				String result3= result2.replace("\\", "");
				System.out.println("5:-------"+result3);
				//去掉首尾的引号
				String result4 = result3.substring(1, result3.length() - 1);
				System.out.println("6:-------"+result4);
				Map<?, ?> map = JSON.parseObject(result1, Map.class);
				if(map.get("duration")!=null&&!"".equals(map.get("duration"))){
					return map.get("duration").toString();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

运行项目得到结果如下所示:

1:-------{"code":200,"status":"success","message":"success","data":[{"vid":"b5dd6d8e21f4bc424693d6a784695d30_b","duration":"00:00:15"}]}
2:-------{"message":"success","status":"success","data":[{"duration":"00:00:15","vid":"b5dd6d8e21f4bc424693d6a784695d30_b"}],"code":200}
3:-------[{"duration":"00:00:15","vid":"b5dd6d8e21f4bc424693d6a784695d30_b"}]
4:-------"{\"duration\":\"00:00:15\",\"vid\":\"b5dd6d8e21f4bc424693d6a784695d30_b\"}"
5:-------"{"duration":"00:00:15","vid":"b5dd6d8e21f4bc424693d6a784695d30_b"}"
6:-------{"duration":"00:00:15","vid":"b5dd6d8e21f4bc424693d6a784695d30_b"}

看上去貌似成功啦,但是要注意:jsonObject.get("data")得到的是一个JSONArray,而不是String,那么,当JSONArray为空的时候if(jsonObject.get("data")!=null&&!"".equals(jsonObject.get("data")))】这样判断就不对,系统会报错,控制台输出结果如下所示:

因此,我又把PolyvTokenUtil类里面的getPolyvDuration()改为如下:

   /**
	 * 获取视频时长
	 * @param request
	 * @param vid
	 * @return
	 */
	public static String getPolyvDuration(HttpServletRequest request,String vid){
		try {
			String userId = "123456"; // polyv 提供的服务器间的通讯验证
			String secretkey = "123456"; // polyv 提供的接口调用签名访问的key
			String ptime = ""+System.currentTimeMillis(); // 时间戳
			String str="ptime="+ptime+"&vids="+vid+secretkey;
			String sign=SecuritySHA1Utils.shaEncode(str).toUpperCase();
			String url="http://api.polyv.net/v2/video/"+userId+"/info";
			String param="ptime="+ptime+"&sign="+sign+"&vids="+vid;
			String result=sendGet(url,param);
			System.out.println("1:-------"+result);
			JSONObject jsonObject = JSONObject.parseObject(result);
			System.out.println("2:-------"+jsonObject);
			JSONArray dataNJson = jsonObject.getJSONArray("data");
			System.out.println("dataNJson:"+dataNJson);
			if(dataNJson.isEmpty()||dataNJson.size()<1){
				return null;
			}else{
				String string = dataNJson.getString(0);
				JSONObject fromObject = JSONObject.parseObject(string);
				String duration = fromObject.getString("duration");
				System.out.println("duration:"+duration);
				return duration;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

运行项目得到结果如下所示:

1:-------{"code":200,"status":"success","message":"success","data":[{"vid":"b5dd6d8e21cb480a394d522b3f125d7c_b","duration":"00:00:15"}]}
2:-------{"message":"success","status":"success","data":[{"duration":"00:00:15","vid":"b5dd6d8e21cb480a394d522b3f125d7c_b"}],"code":200}
dataNJson:[{"duration":"00:00:15","vid":"b5dd6d8e21cb480a394d522b3f125d7c_b"}]
duration:00:00:15

OK,大功告成!

综上所述,简而言之,主要归结到一个问题:JSONObject如何获取JSONArray转JSONObject获取某个属性值?

主要代码如下所示:

public static void main(String[] args) {
		String result="{'code':200,'status':'success','message':'success','data':[{'vid':'b5dd6d8e21cb480a394d522b3f125d7c_b','duration':'00:00:15'}]}";
		JSONObject jsonObject = JSONObject.parseObject(result);
		JSONArray jsonArray = jsonObject.getJSONArray("data");
		String string = jsonArray.getString(0);
		JSONObject fromObject = JSONObject.parseObject(string);
		String duration = fromObject.getString("duration");
		String vid = fromObject.getString("vid");
		System.out.println("duration:"+duration);
		System.out.println("vid:"+vid);
}

运行main(),控制台打印输出如下所示:

OK,到此结束!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值