对接口返回 json 的基本处理

目录

前言:

项目背景

主要代码注释


前言:

在现代 Web 应用程序中,API 通常以 JSON 格式返回数据。因此,对接口返回的 JSON 数据进行基本处理非常重要。

项目背景

1.涉及到旧接口为 xml 格式,新接口为 json 格式。
2.涉及到新接口有旧接口字段的合并;
3.我只做了简单的对比,如比对两个接口的返回字段是否值相等;
4.项目使用 java 语言,Maven 管理。

主要代码注释

//使用日志
@Slf4j
public class TestUrlMap {
    //设置请求http参数初始化
    public static final OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(5, TimeUnit.SECONDS)
            .readTimeout(5, TimeUnit.SECONDS)
            .writeTimeout(5, TimeUnit.SECONDS)
            .build();

    public static void diffMap(String code) throws IOException {

       //如果是读取多条url,可以读取文件,我这里直接赋值了。
       String oldUrl = "oldUrl";
       String newUrl = "newUrl" ;


        //获取body
        String oldData = client.newCall(
                new Request.Builder().url(oldUrl).build())
                .execute().body().string();
        String newData = client.newCall(
                new Request.Builder().url(newUrl).build())
                .execute().body().string();

        if (StringUtils.isAnyBlank(oldData, newData)) {
            log.error("获取数据异常, code={}, oldData={}, newData={}", code, oldData, newData);
        }

        //读取到json里面result的内容
        JSONObject oldJson = JSON.parseObject(oldData).getJSONObject("result");
        //XML转换json,并读取里面result内容
        JSONObject newJson = XML.toJSONObject(newData).getJSONObject("result");

        /**
         *数据示例
         * "adcode": "110000",
         "version": 1601,
         */
         //对比字符串
        if (!StringUtils.equals(oldJson.getString("adcode"), newJson.getString("adcode"))) {
            log.error("code={}, adcode 不一致, {}!={}", code, oldJson.getString("adcode"), newJson.getString("adcode"));
            return;
        }
        //对比整数
        if (oldJson.getInt("version") != newJson.getInt("version")) {
            log.error("code={}, version 不一致, {}!={}", code, oldJson.getInt("version"), newJson.getInt("version"));
            return;
        }

        int count = newJson.getInteger("count");
        JSONArray oldEvents = oldJson.getJSONArray("events");
        JSONArray newEvents = newJson.getJSONArray("events");

        if (count != oldEvents.size() || count != newEvents.size()) {
            log.error("code={} events长度不一致, {}!={}", code, oldEvents.size(), newEvents.size());
            return;
        }

        //下面的for循环是对比json里面的数组
        int newI = 0;
        int linkIndex = 0;
        for (int i = 0; i < oldEvents.size(); i++) {
              String oldEvent = StringUtils.trim(oldEvents.getString(i));

              //获取json数组里面第N个值。
              JSONObject newEvent = newEvents.getJSONObject(newI);
              List<String> oldEventList = Splitter.on(",").splitToList(oldEvent);

               //oldEventList.get(29),查找接口文档确定 i 的值,但是要注意java的下标是从0开始计数。
               if (!StringUtils.equals(Strings.nullToEmpty(newEvent.getString("lonlat")), Strings.nullToEmpty(oldEventList.get(29) + "," + oldEventList.get(30)))) {
                   log.error("code={}, enventIndex={}, lonlat 不一致, {}!={}", code, i, oldEventList.get(29) + "," + oldEventList.get(30), newEvent.getString("lonlat"));
                   return;
               }  
         } 

                //这里做的比较是因为新接口把旧接口的很多相关的niLinkIds字段拼接为一个字段了。
                 String niLinkIdsStr = newEvent.getString("niLinkIds");
                 Iterable<String> split = Splitter.on(",").split(niLinkIdsStr);

                 if (!Iterables.get(split, linkIndex, "").equals(Strings.nullToEmpty(oldEventList.get(26)))) {
                     log.error("code={}, enventIndex={}, niLinkIds 不一致, {}!={}", code, i, oldEventList.get(26), newEvent.getString("niLinkIds"));
                     return;
                  }

                  linkIndex++;
                  if (linkIndex >= Iterables.size(split)) {
                       linkIndex = 0;
                       newI++;
                 }

                 log.info("对比成功");
     }
}

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

        /*     List<String> codes = Files.readLines(new File("F:/code.txt"), Charset.forName("utf-8"));
         *     for (String code : codes) {
         *     diffMap(code);
         *      }
         *      这是读取文件,传参数的方式,因为我直接给url赋值了,所以直接调用 diffMap() 就可以了。
         */
                 diffMap(code);
       }
}

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

 【自动化测试交流】:574737577(备注ccc)icon-default.png?t=N6B9http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=qxJZAmfxpSO2iG5DiXEmovrrbqX9lf9Y&authKey=LtqIFckKO2IOCAiI9MaslOjsWuQVoVKRPzUSJH%2F5I9YFBuKr75dUnznAqyCpJ0t6&noverify=0&group_code=574737577

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值