常用的"小指令碼"-json資料處理

2023-03-01 21:01:38

小背景:

我們公司專案中的小指令碼是一些工具類,比如常用的是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<Object>() {});//或者使用方法JsonUtil.toObject(json, Object.class);效果也是一樣的
        Map<String, Object> map1 = (Map<String, Object>) 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<Map<String, Object>> toListMap(String json) {
    List<Object> list = JsonUtil.toObject(json,  new TypeReference<List<Object>>() {});
        List<Map<String, Object>> listw = new ArrayList<Map<String, Object>>();
        for (Object object : list) {
            Map<String, Object> ret = (Map<String, Object>) object;
            listw.add(ret);
        }
        return listw;
}   
/**
* map轉成json字串
*/
Map<String, Object> 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<String, Object> 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<JsonNode> elements = jsonNode.elements();
while (elements.hasNext()) {
    JsonNode node = elements.next();
    System.out.println(node.toString());
}

//也可以迭代獲取到jsonNode的keys
Iterator<String> 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<Map.Entry<String,JsonNode>> jsonNodes = jsonNode.fields();  
   while (jsonNodes.hasNext()) {  
       Map.Entry<String, JsonNode> 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後還可以看到頁面資料,則是同步資料,否則就是非同步資料。




如果本文對你有幫助的話記得給一樂點個贊哦,感謝!