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表解析