上一篇文章的断点传输以后再讲_(:зゝ∠)_,先讲讲json的处理
什么是json???举个例子
似乎短了点,如果用昨天的postURL案例得到的网址去访问的话,也可能会得到类似的结果,不过真实情况是会有结果链接、特征码和图片链接的,怎么会没有呢?
因为复制黏贴直接去访问的话,是没有设置请求头User-Agent的,而服务器会根据请求头,决定是否要对其请求进行处理
设置请求头的方法在前面的教程已经说过了:
httpPost post=new Post(链接);
post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 LBBROWSER");
当然也可以用它来设置其他的请求头!
还有下面才是有加请求头才能得到的完整JSON!
{"errno":0,"errmsg":"","data":{
"querySign":"671742422,3099122694",
"imageUrl":"http:\/\/g.hiphotos.baidu.com\/image\/pic\/item\/8601a18b87d6277f00a269b322381f30e824fc8d.jpg",
"pageUrl":"http:\/\/image.baidu.com\/n\/pc_search?rn=30&appid=0&tag=1&isMobile=0&queryImageUrl=
http%3A%2F%2Fg.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F8601a18b87d6277f00a269b322381f30e824fc8d.jpg&
querySign=671742422%2C3099122694&uptype=upload_pc&fromProduct=&productBackUrl="},"extra":[]}
这里帮大家分行了,其实真是情况是没有换行的!
好了准备开始正片:
怎么解析json?
两个方案:
1.正则表达式
2..网上已经实现好的Json解析的Jar包
推荐选1,Json解析包挺难用的,如果是大神的话,就选Json解析包,后面有个玩意真心难搞......后面再说_(:зゝ∠)_
package EII;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regExp {
/**
* 匹配单个字符串
* @param json
* @param reg
* @return
*/
public static String matcher(String json,String reg){
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(json);
while (m.find()) {
return m.group();
}
return "";
}
/**
* 匹配多个不重复的字符串
* @param json
* @param reg
* @return
*/
public static Vector<String> matcherSet(String json,String reg){
Vector<String> ends=new Vector<>();
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(json);
while (m.find()) {
String str=m.group();
if(ends.indexOf(str)==-1)
ends.add(str);
}
return ends;
}
/**
* 匹配多个重复的字符串
* @param json
* @param reg
* @return
*/
public static Vector<String> matcherList(String json,String reg){
Vector<String> ends=new Vector<>();
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(json);
while (m.find()) {
String str=m.group();
ends.add(str);
}
return ends;
}
}
json是需要处理的字符串
reg是模板
大多数情况,用下面这个模板就可以了
字符串1.+?\\字符串2
结果就是:字符串1***************************字符串2
至少我是这样子的_(:зゝ∠)_
package EII;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Vector;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
public class jsonDispose {
public static void main(String[] args) throws ClientProtocolException, IOException {
getAllE(upLoad.upload(new File("C:\\Users\\Administrator\\Desktop\\0df431adcbef76096709930527dda3cc7cd99e2d.jpg")));
}
public static Vector<String> getAllE(String json) throws ClientProtocolException, IOException{
// long l=new Date().getTime();
json=json.replace("\\", "");
Vector<String> allE=new Vector<>();
String pageUrl=getpageUrl(json);
String queryImageUrl=getQueryImageUrl(json);
String querySign=getQuerySign(json);
pageUrl=pageUrl.substring(0,pageUrl.length()-1);
queryImageUrl=queryImageUrl.substring(0,queryImageUrl.length()-1);
querySign=querySign.substring(0,querySign.length()-1);
allE.add(pageUrl);
allE.add(queryImageUrl);
allE.add(querySign);
String htmlSrc=new String();
InputStream is=downLoad.client.execute(new HttpGet(pageUrl)).getEntity().getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
char[] c=new char[2048];
while (br.read(c)!=-1) {
htmlSrc+=new String(c);
}
br.close();
is.close();
// System.out.println(htmlSrc);
allE.add(getKey(htmlSrc));
// System.out.println(getKey(htmlSrc));
// System.out.println(new Date().getTime()-l);
return allE;
}
public static String getpageUrl(String json){
return regExp.matcher(json, "\"pageUrl\":\".+?\\\"").substring(11);
}
public static String getQueryImageUrl(String json){
return regExp.matcher(json, "\"imageUrl\":\".+?\\\"").substring(12);
}
public static String getQuerySign(String json){
return regExp.matcher(json, "\"querySign\":\".+?\\\"").substring(13);
}
private static String neetKey(String pageUrlSrc){
return regExp.matcher(pageUrlSrc, "a class=\"guess-info-word-link guess-info-word-highlight\".+?\\<");
}
private static String getNeetKey(String neetKey){
return neetKey.substring(neetKey.indexOf(">")+1, neetKey.length()-1);
}
public static String getKey(String pageUrlSrc) throws UnsupportedOperationException, ClientProtocolException, IOException{
String wordKey=regExp.matcher(pageUrlSrc, "'guessWord': '.+?\\'");
boolean b=wordKey.equals("'guessWord': ''.split('");
if(b){
return getNeetKey(neetKey(pageUrlSrc));
}else{
return wordKey.substring(14, wordKey.length()-1);
}
}
}
获取到结果连接也就是pageUrl后,用get请求连接,就可以得到网页结果,不过,在数据量太大的情况会可能会出现数据断层的情况,所以搞好断点传输
顺带一说里面是有关键词的,那个也要获取,一共有两种
第一种是关键词,用getKey就可以获取关键词,不过在某些情况下是找不到的,例如用图片链接去post......,之后就要用第二种了
第二种是类似于近似关键词,也就是getNeetKey去获取,类似于百度搜索结果的;你是不是要找xxx?
打算在后面几期整理下源码_(:зゝ∠)_