使用豆瓣书籍API获取json类型的数据


由于需要,自己要写一个书籍管理系统,但是大量的书籍录入太费时间和精力;所以使用了豆瓣提供的api,下面是过程,从一个什么都不懂的基础来记录。


1.进入豆瓣为开发者提供的网站

https://developers.douban.com/wiki/?title=book_v2

 我需要的是图书api

2.使用java代码给发送get请求

/**
     * 使用isbn码从豆瓣查询书籍信息
     * 
     * @param url   
     *            
     * @param param  书籍的isbn13编码
     *      
     * @return 返回豆瓣发来的json字符串
     */
    public static String sendGet(String param) {
        String result = "";
        BufferedReader in = null;
        try {

        	String urlNameString = "https://api.douban.com/v2/book/isbn/:"+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();

            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;  //返回得到的json字符串
    }

3.解析json串,提取所需的信息

作者所需的是json的其中一部分,并非所有,处理json字符串代码如下:

Book类

/**
 * 图书的类
 * @author Andy
 *
 */
public class Book {
	private String bid;
	private String bname;
	private String pinyin;
	private String isbn;
	private String press;
	private String author;
	private int num;
	private int shengyu;
	private String image;
	private String cid;
	private String summary;
	
	public String getBid() {
		return bid;
	}
	public void setBid(String bid) {
		this.bid = bid;
	}
	public String getBname() {
		return bname;
	}
	public void setBname(String bname) {
		this.bname = bname;
	}
	public String getPinyin() {
		return pinyin;
	}
	public void setPinyin(String pinyin) {
		this.pinyin = pinyin;
	}
	public String getIsbn() {
		return isbn;
	}
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
	public String getPress() {
		return press;
	}
	public void setPress(String press) {
		this.press = press;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public int getShengyu() {
		return shengyu;
	}
	public void setShengyu(int shengyu) {
		this.shengyu = shengyu;
	}
	public String getImage() {
		return image;
	}
	public void setImage(String image) {
		this.image = image;
	}
	public String getCid() {
		return cid;
	}
	public void setCid(String cid) {
		this.cid = cid;
	}
	public String getSummary() {
		return summary;
	}
	public void setSummary(String summary) {
		this.summary = summary;
	}
	@Override
	public String toString() {
		return "Book [bid=" + bid + ", bname=" + bname + ", pinyin=" + pinyin
				+ ", isbn=" + isbn + ", press=" + press + ", author=" + author
				+ ", num=" + num + ", shengyu=" + shengyu + ", image=" + image
				+ ", cid=" + cid + ", summary=" + summary + "]";
	}
	
	
	
}

处理json的类方法

package com.telneting.bookmate.utils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;

import net.sf.json.JSONObject;

import com.telneting.bookmate.book.domain.Book;

/**
 * 使用get请求调用豆瓣api
 * @author Andy
 *
 */
public class DouBanUtils {
    /**
     * 使用isbn码从豆瓣查询书籍信息
     * 
     * @param url   
     *            
     * @param param  书籍的isbn13编码
     *      
     * @return 返回豆瓣发来的json字符串
     */
    public static String sendGet(String param) {
        String result = "";
        BufferedReader in = null;
        try {

        	String urlNameString = "https://api.douban.com/v2/book/isbn/:"+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();

            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;
    }

  
  
    /**
     * 将豆瓣的返回的json数据封装成Book对象
     * @return
     */
    public static Book toBook(String jsonStr){
    	JSONObject jsonObject = JSONObject.fromObject(jsonStr);
		//提取所需要的字段
		String bname = jsonObject.getString("title");
		String isbn13 = jsonObject.getString("isbn13");
		String press = jsonObject.getString("publisher");
		List authors = (List) jsonObject.get("author");
		String author = DouBanUtils.listToString(authors);
		String summary = jsonObject.getString("summary");
		Object imgs = jsonObject.get("images");
		String image = DouBanUtils.getPic(imgs);
		
		
		Book book = new Book();
		book.setAuthor(author);
		book.setBname(bname);
		book.setIsbn(isbn13);
		book.setPress(press);
		book.setSummary(summary);
		book.setImage(image);
		return book;
    }
    
    
    
    /**
	 * 将List集合返回成字符串形式
	 * @return
	 */
	private static String listToString(List list){
		String str = list.toString();
		str = str.replace("\"", "");
		str = str.replace("[", "");
		str = str.replace("]", "");
		str = str.replace(" ", "");
		return str;
	}
	
    /**
     * 从json里的子对象获取他的内容
     * @param obj
     * @return
     */
    private static String  getPic(Object obj){
    	JSONObject json = JSONObject.fromObject(obj.toString());
    	String img = json.getString("large");
    	return img;
    }
	
	
}

4.测试类

@Test
	public void fun2(){
		String str = DouBanUtils.sendGet("9787115253699");
		Book b  = DouBanUtils.toBook(str);
		System.out.println(b);
		System.out.println(str);
	}

简单好上手的东西,花了很多时间在找申请页面...原来不需要申请直接能使用;

像是聚合数据其他一些,就要申请数据,使用API时候需要使用一个key才能调用!






你可能感兴趣的:(java调用API)