使用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流的使用,集合的使用,多线程的使用.