1.java代码,结构如下入
1.pom.xml文件
<!--string和json数据交换转换jar包-->
<dependencies>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
</dependencies>
<!--Spring Boot可以以jar包的形式独立运行。指定运行主类 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>getjson.Iputil</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2. 通过此数据解析后存入文件中
作用:解析出result的数据存入文件
3.发送get请求,并将数据存入文件
package getjson;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.io.*;
import java.HttpURLConnection;
import java.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Iputil {
static int count = 1;
public static void main(String[] args) throws ParseException {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sj = new SimpleDateFormat("yyyyMMdd");
//当前时间减去一天,即一天前的时间
calendar.add(Calendar.DATE, -1);
String str = sj.format(calendar.getTime());
Iputil iputil = new Iputil();
System.out.println(str);
iputil.run(str,iputil);
}
/**
* 发送get请求得到返回数据的方法
* @param datetime 需要请求那一天的数据
* @param iputil 当前类的对象
*/
public void run(String datetime, Iputil iputil ) {
boolean hasNext = true;
int pageNum = 0;
while (hasNext) {
pageNum++;
try {
// URL url = new URL("https://tmtbi.tcl/api/bi/v1/ewdetail?startDay="+datetime+"&endDay="+datetime+"&pageSize=1000&pageNum="+pageNum);
URL url = new URL("https://tmtbi.tcl/api/bi/v1/ewdetail?startDay="+datetime+"&endDay="+datetime+"&pageSize=1000&pageNum="+pageNum);
System.out.println("请求地址:"+url);
//开发访问此连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
//设置连接时间为5秒
urlConn.setConnectTimeout(5 * 10000);
//设置读取时间为5秒
urlConn.setReadTimeout(5 * 10000);
// 设置是否向httpUrlConnection输出,因为这个是get请求,参数要放在
// http正文内,因此需要设为true, 默认情况下是false;
urlConn.setDoOutput(true);
// 设置是否从httpUrlConnection读入,默认情况下是true;
urlConn.setDoInput(true);
// Get 请求不能使用缓存
urlConn.setUseCaches(false);
// 设定传送的内容类型是可序列化的java对象,setRequestProperty的信息都是设置在head头里面
// (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)
urlConn.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");
urlConn.setRequestProperty("token", "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJrdGJpIiwicm9sZSI6IlJPTEVfVVNFUiIsImlzcyI6InRjbGVyIiwiZXhwIjoxNTk5ODA3Mzc5LCJpYXQiOjE1OTkyMDI1Nzl9.IciVkGcsYfD9hDacV4-lKkGFft-Z-LnEkmYtcDlPjYeN2styo3IA6dbE0JP08bmy8uS8sy3TL_65_fTbEoilow");
urlConn.setRequestProperty("Content-type", "application/x-java-serialized-object");
int code = urlConn.getResponseCode();//获得相应码
System.out.println("请求响应码:"+ code);
// 设置所有的http连接是否自动处理重定向;设置成true,系统自动处理重定向
urlConn.setInstanceFollowRedirects(true);
// 存储返回的字符串
String data = "";
//得到数据流(输入流)
InputStream is = urlConn.getInputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = is.read(buffer)) != -1) {
String str = new String(buffer, 0, length);
data += str;
}
System.out.println("请求页面:"+pageNum);
// 将yyyyMMdd的日期转化为yyyy-MM-dd类型的日期
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
formatter.setLenient(false);
Date newDate = formatter.parse(datetime);
formatter = new SimpleDateFormat("yyyy-MM-dd");
String filedir = formatter.format(newDate);
hasNext = iputil.createJsonFile(data,"/root/download/"+filedir+"/"+pageNum);
// hasNext = iputil.createJsonFile(data,"E:\\download\\"+filedir+"\\"+pageNum);
} catch (Exception e) {
e.printStackTrace();
hasNext = false;
}
}
}
/**
* 将JSON数据格式化并保存到文件中
* @param jsonData 需要输出的json数
* @param filePath 输出的文件地址
* @return flag 判断是否有下一页
*/
public boolean createJsonFile(String jsonData, String filePath) {
// 标记是否还有下一页
boolean flag = true;
JSONObject json = JSONObject.fromObject(jsonData);//大括号object 字符串string 数组list
JSONObject dataObj = json.getJSONObject("data");
JSONArray tuplesArray = dataObj.optJSONArray("result");
flag = dataObj.optBoolean("hasNext");
// 生成json格式文件
try {
// 保证创建一个新文件
File file = new File(filePath);
if (!file.getParentFile().exists()) { // 如果父目录不存在,创建父目录
file.getParentFile().mkdirs();
}
if (file.exists()) { // 如果已存在,删除旧文件
file.delete();
}
file.createNewFile();
// 将格式化后的字符串写入文件
Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
for (int i = 0; i < tuplesArray.size(); i++) {
JSONObject tuplesObj = tuplesArray.optJSONObject(i);
// 在后面加上行的分隔符
write.write(tuplesObj.toString()+"\t\n");
}
write.flush();
write.close();
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
}
2.将打好的jar上传到服务器
1.打包步骤
点击idea的Maven后,点击package。如下图
2.执行打包后的jar
java -jar tcltv-1.0-SNAPSHOT.jar
3.问题总结
问题:用下面的代码得到的data数据会出现乱码
原因:data是1024byte拼接得到的。1204byte长度之间可能是一个字符
// 存储返回的字符串
String data = "";
//得到数据流(输入流)
InputStream is = urlConn.getInputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = is.read(buffer)) != -1) {
String str = new String(buffer, 0, length);
data += str;
}
解决:更改为如下代码
String data = "";
BufferedReader in = new BufferedReader(
new InputStreamReader(urlConn.getInputStream()));
String current;
while ((current = in.readLine()) != null) {
data += current;
}
更多推荐
java发送get请求获取json数据 存入文件供hive表解析
发布评论