• 常用的"小脚本"-json数据处理



    小背景:

    我们公司项目中的小脚本是一些工具类,比如常用的是MapUtil工具类的一些方法

    写公司的MapUtil工具类的方法要注意,方法名的命名,因为方法名,在公司的项目的某个业务流程有对方法名的进行String截取开头字符串然后进行判断


    一、工具的使用推荐

    1、获取到请求url(接口的形式-一般数据都是json)

    ☺ 推荐谷歌浏览器,当然其他浏览器也可以的

    在network 下,刷新获取目标url


    2、获取到目标url(是json数据格式)

    ☺ 推荐火狐浏览器,直接在火狐的地址栏搜索目标url,就可以得到格式美化后的json数据了


    3、小细节

    (1) 使用谷歌浏览器,获取目标url进行复制的时候,有一个小细节-选择copy,不要选copy value

    • 因为copy value 会对url中的某些参数进行utf8格式转化



    二、网页的Json数据和java代码的Map数据

    真实业务需求中的数据结构比较复杂,多层嵌套,比如请求url的json数据:map中嵌套list,然后list的每个元素是map,这个map又嵌套了map。

    ☺ 小细节:要注意嵌套的是map还是list(因为0、1、2、3、4... 既可能是索引下标,也可能只是key):

    • 通过火狐浏览器折叠后的形状做判断,比如{} 则是map,如果是[] 说明是list
    • 如果是idea 调试,也是要注意debug 模式下的类型提示。因为debug 模式下,比如set类型的数据结构,有5个元素,它会给0、1、2、3、4存储一下元素然后再展示给你观察,但是要是你注意到提示的类型是Set类型的话,你就清楚在内存中,存储的绝对不是0、1、2、3、4 这样连续存储。

    1、网页的json数据

    例子:

    ☺ json 数据格式特点:

    key:value

    键值对之间是冒号形式


    ■ json 数据的本质:

    就是字符串,json字符串。


    2、java代码的Map数据


    ☺ Map 数据格式特点:

    key=value

    键值对之间是等号形式


    3-1、业务处理-json和map的相互转换【json 序列化、反序列化】

    (1) 推荐使用: JsonUtil 工具类

    其实就是封装了ObjectMapper 关于json和map的相互转换。toObject方法封装的是readValue方法,toJson封装的是writeValueAsString方法。

    • json转换成map:JsonUtil.toObject(String content, Class valueType) 返回值是一个 T 类型的

      或者 JsonUtil.toObject(String content, TypeReference valueTypeRef) 返回值是一个 T 类型的

      ▷ 返回值还是T 类型(相当于Object类型),要想进一步转换map,可以强转一下

    • map转成json:JsonUtil.toJson(Object obj)


    ■ 例子-json转map:

    /** 
    * json字符串(非常普通的key:value)转成map
    */
    String json = createJsonString("user","xiaoming");
           Object object1 = JsonUtil.toObject(json, new TypeReference() {});//或者使用方法JsonUtil.toObject(json, Object.class);效果也是一样的
            Map map1 = (Map) object1;
            System.out.println(map1.toString());
            System.out.println(map1.getClass());
    
    	/*创建json字符串的方法*/
        public static String createJsonString(String key, Object value) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put(key, value);
            return jsonObject.toString();
        }
    
    
    /** 
    * json字符串(listmap)转成ListMap
    */
    public static List> toListMap(String json) {
        List list = JsonUtil.toObject(json,  new TypeReference>() {});
            List> listw = new ArrayList>();
            for (Object object : list) {
                Map ret = (Map) object;
                listw.add(ret);
            }
            return listw;
    }   
    
    
    /**
    * map转成json字符串
    */
    Map oldMap1 = new HashMap<>();
    oldMap.put("1", "一");
    String json = JsonUtil.toJson(oldMap);
    System.out.println(json);
    

    (2) 直接使用:ObjectMapper

    map 在java中,可以划分到更大的范围进行处理-Object进行处理

    • json转换成map:

      readValue(String content, Class valueType) 返回值是一个 T 类型的

      或者 readValue(String content, TypeReference valueTypeRef) 返回值是一个 T 类型的

      ▷ 返回值还是T 类型(相当于Object类型),要想进一步转换map,可以强转一下

    • map转成json:

      writeValueAsString(Object obj)

    /**
    * map转成json字符串
    */
    Map oldMap1 = new HashMap<>();
    oldMap.put("1", "一");
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(oldMap);
    System.out.println(json);
    

    3-2、业务中,将map转成了json字符串后,想获取json字符串中的key或者value

    • 如果是数据非常简单,量非常小,可以使用String的相关截取合并函数,但是不建议,因为json数据的key长度不是固定的,截取非常麻烦

    思路:将json字符串转成json(节点)对象

    节点:这块理解和dom元素的node是一样的。每个元素都可以理解位一个节点。


    ■ 例子:

    细节:如果是一个JsonNode数组,使用jsonNode.elements();读取数组中每个node, 如果不是JsonNode数组,使用jsonNode.elements();返回jsonNode的values

    //首先把嵌套map转换json字符串
    String jsonStr = mapper.writeValueAsString(oldMap);
    //把json字符串转换jsonNode节点对象,通过jsonNode可以获取到想要的字段
    JsonNode jsonNode = mapper.readValue(jsonStr, JsonNode.class);
    
    //迭代获取到jsonNode的values
    Iterator elements = jsonNode.elements();
    while (elements.hasNext()) {
        JsonNode node = elements.next();
        System.out.println(node.toString());
    }
    
    //也可以迭代获取到jsonNode的keys
    Iterator keys = jsonNode.fieldNames();
    while (keys.hasNext()) {
         String key = keys.next();
         System.out.println("key键是:" + key);
    }
    
    //通过key 获取到 value
    JsonNode jNode = jsonNode.get(key);//得到value,value可能是普通的值,也可能是map
    
    
    //获取到键值对
    Iterator> jsonNodes = jsonNode.fields();  
       while (jsonNodes.hasNext()) {  
           Map.Entry node = jsonNodes.next();  
           System.err.println("遍历获取key:"+node.getKey());  
           System.err.println("遍历获取值:"+node.getValue().toString());
    }
    

    • JsonNode节点对象(看出Object)转成 josn 字符串,使用JsonUtil.toJson(jsonNode) 方法即可。



    三、关于网页相关的常识

    1、网页打不开

    原因:可能是网站是在外网,网速受到限制;也可能是该网页的大小太大了(常见情况就是该网页有非常非常多的图片),并且网站还是在外网;

    解决:vpn


    2、网页打开慢时,如何查看网页加载的大小和时间

    transferred over network和 resources loaded by the page 区别:

    其实和content-encoding: gzip相关;两者的差别就在于压缩上,transferred 是前端页面加载的所有资源经过解压之后的原始大小。


    ■ 还可以查看某个请求的大小,比如图片请求的大小

    一般默认下,直接查看就可以啦(毕竟看完也只是做个大概预判)


    • 如果想更精准的查看某个请求的情况:


    3、善用network 提供的过滤项

    (1) 通过过滤,保留接口请求


    (2) 直接通过关键词过滤


    4、关于刷新获取到请求url

    关键:看的是页面的布局,例如滚动布局,为了获取到url,你需要滚动页面进行刷新;

    通用:按F5刷新。

    具体情况具体分析,例如你想获得某个点击事件的url,打开network,那就点击一下(按钮),然后观察network新增了一条url。


    5、快速判断页面的数据是同步加载还是异步加载

    ☺ 使用谷歌浏览器,禁止js,如果禁止js后还可以看到页面数据,则是同步数据,否则就是异步数据。




    如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

  • 相关阅读:
    springboot+vue+elementui家具销售电商管理平台java
    计算机网络原原理学习资料分享---第一章/第一节(为有梦想的自己加油!)
    JavaEE初阶之IO流快速顿悟一(超详细)
    chapter4——时钟分频器
    大语言模型相关工具使用链接
    Apache Spark UI 命令注入漏洞 CVE-2022-33891
    yhtest
    [vue3] 使用ElementPlus页面布局搭建架子
    Java中Map转对象
    探索人工智能的世界:构建智能问答系统之前置篇
  • 原文地址:https://www.cnblogs.com/shan333/p/17169152.html