【Java Json互转】命令行输出

4 篇文章 0 订阅

Java爬取赛事网站


在这里插入图片描述



参与社区的问题回答

问题回答
这个作业属于哪个课程软件工程-23年春季学期
这个作业要求在哪里软件工程实践第二次作业—文件读取
这个作业的目标完成对澳大利亚网球公开赛相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序
其他参考文献

Gitcode项目地址

点击这里前往查看源码

在这里插入图片描述

运行🛠️

Java -jar AOSearch.jar input.txt output.txt


PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划3090
• Estimate• 估计这个任务需要多少时间3090
Development开发570630
• Analysis• 需求分析 (包括学习新技术)12060
• Design Spec• 生成设计文档6060
• Design Review• 设计复审6090
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)3010
• Design• 具体设计6090
• Coding• 具体编码180180
• Code Review• 代码复审3030
• Test• 测试(自我测试,修改代码,提交修改)3030
Reporting报告9090
• Test Repor• 测试报告3030
• Size Measurement• 计算工作量3030
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划3030
total合计690810


💡

解题思路描述

  1. 获取有关网站中 : players,results 的相关json 数据

实现: 开发者工具,监听页面加载的网络请求,找到json,通过预览确定是哪个文件

在这里插入图片描述

问题

players出现和results一开始出现问题,监听中没有出现

采用 jsoup,爬取网页页面里面的内容,就可以找到源地址,然后再打开

在这里插入图片描述



接口设计和实现过程

把所有的json放在一个文件夹,然后通过fastjson, 在Lib.java 工具类里面去访问

实现: 举例:players.json的调用

在这里插入图片描述


编写中的测试

设置 项目调试配置,构建并运行,主函数 args的 arg[0],arg[1]

在这里插入图片描述



关键代码展示

outFile 循环输出到 output文件

    public void outPutAllPlayers(BufferedWriter bw) {
        try {
            allPlayers temp = getAllPlayers();
            int num = Integer.parseInt(temp.getAllPlayersNums());
            System.out.println(num);
            for (int i=0;i< num;i++) {
                allPlayers.Players tempMedals=temp.playersList.get(i);
                bw.write("full_name"+tempMedals.getFull_name()+"\n");
                bw.write("short_name:"+tempMedals.getShort_name()+"\n");
                bw.write("gender:"+tempMedals.getGender()+"\n");
                bw.write("Birth_place:"+tempMedals.getBirth_place()+"\n");
                bw.write("coach:"+tempMedals.getCoach()+"\n-----\n");
            }
            bw.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

读取 Json 文件

    /**
     * @param fileName:
     * @return str
     * @ClassName: readJsonFile
     * @author 14533
     * @description TODO
     * @date 2023/2/26 14:52
     */
    public static String readJsonFile(String fileName) throws FileNotFoundException {
        String str="";
        FileInputStream inputStream = new FileInputStream(fileName);
        try {
            int ch=0;
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
            StringBuffer sb = new StringBuffer();
            try {
                while ((ch=br.read())!=-1) sb.append((char)ch);
                br.close();
                str=sb.toString();
                return str;
            }catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
  • Lib 获取schedule的循环操作
JSONObject eachSchedule = matches.getJSONObject(i);
            JSONArray eachTeam = JSONArray.parseArray(eachSchedule.getString("teams"));
            String getTime = eachSchedule.getString("actual_start_time");
            JSONObject teamOne = eachTeam.getJSONObject(0);
            JSONObject teamTwo = eachTeam.getJSONObject(1);
            JSONObject winner = teamOne.getString("status") == null ?  teamTwo: teamOne;
            String winnerUids = whichTeam(winner.getString("team_id"), teams).getString("players");
            JSONArray winnerPlayers = whichPlayer(winnerUids, players); // 名字
            JSONObject winnerPlay = winnerPlayers.getJSONObject(0);
            String play = winnerPlay.getString("short_name");
            JSONArray scoreOne = JSONArray.parseArray(teamOne.getString("score"));
            JSONArray scoreTwo = JSONArray.parseArray(teamTwo.getString("score"));
            for (int e = 0; e < scoreOne.size(); e++) {
                String tempScore = "";
                tempScore = scoreOne.getJSONObject(e).getString("game") + ":" + scoreTwo.getJSONObject(e).getString("game");
                if( e + 1 < scoreOne.size())
                    tempScore = scoreOne.getJSONObject(e).getString("game") + ":" + scoreTwo.getJSONObject(e).getString("game") + " | " +scoreOne.getJSONObject(e+1).getString("game") + ":" + scoreTwo.getJSONObject(e+1).getString("game");
                tempResult = new resultDate.resultPlay();
                tempResult.setResultPlay(getTime,play,tempScore);
                strResult.add(tempResult);
            }

性能改进

共计 788 个选手信息,包括大量的图片信息,创建java类,先json读取指定json内容然后再返回

class allPlayers {
    private String players;
    public List<Players> playersList;
    /**
     * @ClassName Players:
     * @author 14533
     * @description TODO
     * @date 2023/2/26 14:21
     */
    public static class Players {
        private String full_name;
        private String short_name;
        private String gender;
        private String birth_place;
        private String coach;
        public Players() { }
        /**
         * @param fullname:
         * @param shortname:
         * @param sgender:
         * @param birthplace:
         * @param coachs:
         * @return void
         * @author 14533
         * @description TODO
         * @date 2023/2/26 14:29
         */
        public void setPlayers(String fullname, String shortname, String sgender, String birthplace, String coachs) {
            full_name = fullname;
            short_name = shortname;
            gender = sgender;
            birth_place = birthplace;
            coach = coachs;
        }
        public String getFull_name() {return full_name;}
        public String getShort_name() {return short_name;}
        public String getGender() {return gender;}
        public String getBirth_place() {return birth_place;}
        public String getCoach() {return coach;}
    }
    /**
     * @param total:
     * @param listPlayers:
     * @return null
     * @author 14533
     * @description TODO
     * @date 2023/2/26 14:31
     */
    public allPlayers(String total, List<Players> listPlayers) {
        players = total;
        playersList = listPlayers;
    }
    public String getAllPlayersNums() { return players; }
}

单元测试

junit 选择test用例

列举:

测试 查询比赛中的选手的信息如果没有选手系统会不会出错

    @Test
    public void whichPlayerTestNull() {
        boolean flag = false;
        JSONArray winners = null;
        JSONArray uuids = JSONArray.parseArray("['240324-69652871-6852368']");
        for(int i = 0; i < uuids.size(); i++) {
            flag = true;
        }
        assertTrue(flag);
    }
    @Test
    public void whichPlayerTestEmpty() {
        JSONArray winners = null;
        JSONArray uuids = JSONArray.parseArray(null);
        for(int i = 0; i < uuids.size(); i++) {
            flag = true;
        }
        assertTrue(flag);
    }

两个测试类,用判断是否能进去for做断言的结果

情况结果
传入的选手uuid不在选手列表循环继续但return不输出结果
传入null,表示没有获取到uuid循环不继续,程序直接退出

调整

循环结果强制退出输出 null

for循环前判断 uuids.size() 长度 == 0 跳过循环输出 error


异常处理

  1. 文件读取都添加了,文件读取不到的异常处理

FileNotFoundException

  1. 对付无法转义,阻止程序出现编译失败

UnsupportedEncodingException

  1. 其他的没发现,统一有问题就直接捕获

IOException


心路历程与收获

  1. 对Java类的相互引用,封装,测试有了更深的了解
  2. 学会了运用 fastJson调用json文件
  3. 学习了阿里巴巴代码编写规范后,对企业级编码的规范有了了解,也发现这样写代码最后检查也更加方便
  4. 优化了Idea的自定义注释
  5. 对先打代码还是先写计划有了体会,在计划会省去很多不必要的边写边改的过程,而且可以在编写之前解决大部分对代码不熟悉的部分,减轻过程中因为知识受限造成的问题
  6. 单元测试不是很明白
  7. 总的来说:掌握了 fastjson,junit,Lib类编写,主函数调用这样的方式。还有在测试和总结和收集数据方面的欠缺。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THIM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值