FastJSON的基本使用

6 篇文章 0 订阅
3 篇文章 0 订阅
使用FastJSON将访问到的JSON数据转化为java数组写入到指定文件中

例子:访问音乐网站的JSON数据格式化后写入txt文件中

首先创建音乐实体类:

 package homework;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 音乐数据实体类
 * 
 * @author PaxtonWu
 *
 */
public class MusicData {

	/** 编号 */
	private int id;
	/** 歌曲名称 */
	private String name;
	/** 专辑 */
	private String ablum;
	/** 作者 */
	private String artist;
	/** 文件大小 */
	private long size;
	/** 更新时间 */
	private long uptime;
	/** 歌曲风格 */
	private String style;
	/** 存储路径 */
	private String path;

	public String getAblum() {
		return ablum;
	}

	public void setAblum(String ablum) {
		this.ablum = ablum;
	}

	public String getArtist() {
		return artist;
	}

	public void setArtist(String artist) {
		this.artist = artist;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public long getSize() {
		return size;
	}

	public void setSize(long size) {
		this.size = size;
	}

	public String getStyle() {
		return style;
	}

	public void setStyle(String style) {
		this.style = style;
	}

	public long getUptime() {
		return uptime;
	}

	public void setUptime(long uptime) {
		this.uptime = uptime;
	}

	/**
	 * 将文件的大小单位由字节转化为兆
	 * 
	 * @param size
	 * @return
	 */
	public String getMusicSize(long size) {
		double d = (double) size;
		BigDecimal b = new BigDecimal(d / 1024 / 1024).setScale(2, RoundingMode.HALF_UP);
		return b + "MB";
	}

	/**
	 * 将更改时间的毫秒数转化为日期格式
	 * 
	 * @param uptime
	 * @return
	 */
	public String getUptime(long uptime) {

		Date date = new Date(uptime);
		SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return dtf.format(date);
	}

	@Override
	public String toString() {

		return id + "\t" + name + "\t" + ablum + "\t" + artist + "\t" + getMusicSize(size) + "\t" + getUptime(uptime)
				+ "\t" + style + "\t" + path;
	}

}

该实体类属于充血模型,加入了2个方法用于对属性类型的转换,并重写toString()方法.

然后考虑到代码的封装性问题,于是我创建了一个工具类,可以通过该工具类轻松访问在线API地址,并获取响应的数据.

package homework;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * HTTP工具类,可以通过该工具类轻松访问在线API地址 并获取响应的数据
 * 
 * @author PaxtonWu
 *
 */
public class HttpUtils {

	static class CallRemoteData implements Callable<String> {

		private String url;

		public CallRemoteData(String url) {
			this.url = url;
		}

		@Override
		public String call() throws Exception {
			// 根据提供的url地址构建一个URL对象
			URL urlConn = new URL(url);
			// 打开连接
			HttpURLConnection conn = (HttpURLConnection) urlConn.openConnection();
			// 设置请求方式
			conn.setRequestMethod("GET");
			// 获取响应的状态码
			int code = conn.getResponseCode();
			if (code == HttpURLConnection.HTTP_NOT_FOUND) {
				throw new Exception("请求的资源不存在!");
			}
			if (code == HttpURLConnection.HTTP_INTERNAL_ERROR) {
				throw new Exception("服务器内部错误");
			}
			if (code != HttpURLConnection.HTTP_OK) {
				throw new Exception("未知错误!");
			}
			BufferedReader br = null;
			try {
				// 获取连接的输入流
				InputStream is = conn.getInputStream();
				InputStreamReader isr = new InputStreamReader(is, "utf-8");
				br = new BufferedReader(isr);
				// 创建一个可变长字符串
				StringBuffer sbf = new StringBuffer();
				String str = "";
				while ((str = br.readLine()) != null) {
					sbf.append(str).append("\r\n");
				}
				return sbf.toString();
			} finally {
				if (br != null)
					br.close();
				// 断开连接
				conn.disconnect();
			}
		}
	}

	/**
	 * 根据提供的url地址字符串获取服务端响应回来的字符串数据
	 * 
	 * @param url
	 * @return
	 */
	public static String getData(String url) {
		try {
			// 创建Callable对象
			Callable<String> call = new CallRemoteData(url);
			FutureTask<String> task = new FutureTask<>(call); // Runnable
			// 创建并启动线程
			new Thread(task).start();
			// 获取执行结果并返回
			return task.get();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		return null;
	}

//	public static void main(String[] args) {
//		
//		String url = "http://music.softeem.top/list";
//		String json = HttpUtils.getData(url);
//		System.out.println(json);
//	}
}

之后直接创建主方法,访问网址:http://music.softeem.top/list,获取到JSON数据:
在这里插入图片描述

后将其转为java数组,写入到D:\MusicData.txt中.(以下代码涉及到FastJSON插件的使用,运行以下代码时需要先安装FastJSON)

package homework;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.softeem.lesson41.http.HttpUtils;

/**
 * 访问以下地址:
 * 
 * `http://music.softeem.top/list`
 * 
 * 将获取的数据缓存到本地文件,要求按照以下格式显示:
 * 
 * ```歌曲id 歌曲名 专辑 演唱者 大小 上传时间 存储地址 
 * 1 mojito mojito 周杰伦 4.5MB 2020-07-09
 * 10:22:21 2 。。。。 。。。 。。 。。 。。。 。。 3 ```
 * 
 * 
 * @author PaxtonWu
 *
 */
public class FormatJSONData {

	public static void main(String[] args) throws IOException {

		String url ="http://music.softeem.top/list";
		String data = HttpUtils.getData(url);
//		System.out.println(data);
		List<MusicData> list = JSON.parseArray(data, MusicData.class);
		System.out.println(list.get(0));
		File file =new  File("D:\\MusicData.txt");
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
		String title="歌曲id\t歌曲名\t专辑\t演唱者\t大小\t上传时间\t存储地址";
		bw.write(title);
		bw.newLine();
		String str="";
		for (MusicData music : list) {
			str=music.toString();
			bw.write(str+"\n");
		}
		bw.close();
		

        
	}

}

运行以上代码后,保存到txt文件的数据如下:
在这里插入图片描述
以上内容涉及到了面向对象基础,FastJSON插件的使用,基于Http协议访问网络数据的使用,IO流的使用,集合的使用,多线程的使用.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值