日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

处理JSON最强命令jq使用详解

發(fā)布時間:2024/3/12 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 处理JSON最强命令jq使用详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

史上最全jq命令使用詳解

    • 一. 前言
    • 二. 語法
      • 1. 使用語法
      • 2. 概念理解
    • 三. 主要用法
      • 1. 常見表達式含義
      • 2. 基本使用場景
      • 3. 重組
      • 4. 管道的使用
      • 5. 內置函數(shù)的使用
    • 四. 示例文件json.txt

一. 前言


本文價值千金, 閱讀前請先收藏.

jq命令是處理json字符串的神器, 主要用于獲取JSON屬性/簡單重組JSON字符串.

本章將詳細介紹jq的主要應用場景, 幫助大家在平時工作中處理JSON的效率大大提升.


二. 語法


1. 使用語法

jq 表達式 處理源

處理源可以為文件路徑或管道: 讀取后必須為JSON對象, JSON數(shù)組, JSON對象流三類


2. 概念理解

  • JSON對象
    以{開頭, 以}結尾的JSON字符串, 形如{}示例:
{"productId": "2048200008352211","productName": "COACH蔻馳佩利系列 馬車標識米蘭編織鏈石英表" }
  • JSON數(shù)組
    以[開頭, 以]結尾的JSON字符串, 元素間用,分隔
    包括基本數(shù)組和JSON對象數(shù)組, 形如[{},{},{}]

基本數(shù)組: 元素為基本數(shù)據類型, 如[1,2,3,5], [“shanghai”, “guangzhou”,“beijing”]
JSON對象數(shù)組: 元素為JSON對象, 略

  • JSON對象流
  • 常規(guī)的JSON定義沒有這種結構, 是jq命令支持的一種字符串結構類型
  • 概念名字是我自己隨便起的, 主要是方便理解
  • JSON對象流和JSON數(shù)組有點類似: 是指多個連續(xù)的JSON對象組成的字符串, 沒有[開頭, 沒有]結尾, 且元素間沒有分隔符或以空格/換行來分隔, 形如{}{}{}, 示例如下:
  • 特殊地, JSON對象流也可以是基本屬性流, 如"a" "b" "c", 1 2 3
  • 有些情況下JSON對象流無法轉換成JSON數(shù)組, 通過sed命令轉換
    jq '.' | sed 's/^\}/\},/' | sed '1s/.*/\[\{/' | sed '$s/.*/\}\]/
  • {"productId": "2048200008352211","productName": "COACH蔻馳佩利系列 馬車標識米蘭編織鏈石英表"} {"productId": "2048200008352212","productName": "COACH蔻馳佩利系列 馬車標識米蘭編織鏈石英表2"} {"productId": "2048200008352213","productName": "COACH蔻馳佩利系列 馬車標識米蘭編織鏈石英表3"}
    • 根對象
      是指jq命令當前處理的處理源的表達式引用, 在表達式中用.來表示

    • 表達式/路徑
      jq命令是基于表達式輸出結果的, 表達式可以通過.來訪問子屬性或子對象
      表達式的語法, 類似ognl表達式(對象導航語言)
      如.order.address.city表示獲取當前處理源order(子對象)下的address(子對象)的city屬性

    {"uid": 11603,"mobile": "172****1333","order": {"address": {"province": "上海市","city": "海市","distict": "浦東新區(qū)","line": "廣蘭路地鐵站1號口"},"items": [{"itemId": 123,"itemName": "無人機1"},{"itemId": 124,"itemName": "無人機2"}]} }

    三. 主要用法

    本文示例文件json.txt, 在文章最后

    1. 常見表達式含義


    . : 放在表達式開頭, 用來表示.根對象, 也可用在屬性之間作為訪問路徑的連接

    .name: 輸出指定屬性,使用.連接的路徑訪問字段, 路徑可用多層, 如order.items[0].itemId

    .[下標] : 輸出單個指定index的數(shù)組元素(從0開始)

    .[下標1,下標2,..] : 輸出多個指定數(shù)組元素, 結果為JSON對象流

    express[] : 表達式express為JSON數(shù)組, 后面跟[]表示將express表示的JSON對象數(shù)組轉換成JSON對象流, 形如: [{},{},{}]轉換成{}{}{}

    [表達式] : 將JSON對象流組合成JSON對象數(shù)組,形如: {}{}{}組裝成[{},{},{}]

    ,:需要輸出多個表達式的結果用來拼接各表達式, 如 jq '.name,.address.city' json.txt

    | : 管道, 相對于運行兩次jq命令, 前jq運行結果作為后jq的處理源
    根據前jq的運行結果數(shù)據類型分為:
    JSON對象: 可簡化, 如jq '.[0]|.address' json.txt 和 jq '.[0].address' json.txt
    JSON對象數(shù)組: 后置表達式只能用內置函數(shù), 如jq '.[0].arrayBrowser|length' json.txt
    JSON對象流: 相當于對每個元素都運行后置表達式, 整體結果還是JSON對象流,
    如jq '.[0].arrayBrowser[]|.name' json.txt


    注意:

    要想對JSON對象數(shù)組每個元素進行處理, 必須先轉換成JSON對象流


    2. 基本使用場景


    jq '.' json.txt – 格式化

    jq '.[0].address.city' json.txt --獲取指定字段的值(可嵌套)

    jq '.[0].name,.[0].url' json.txt --使用逗號分隔,取多個字段的值;返回值以換行分隔

    jq '.[0].arrayBrowser[0]' json.txt --提取數(shù)組的單個元素

    jq '.[0].arrayBrowser[0,1]' json.txt --提取數(shù)組的多個元素

    jq '.[0].arrayBrowser[]' json.txt – 提取數(shù)組的全部元素轉換成JSON對象流

    jq '[.data.results[]|{topicId,viewCount}]' hjsource.json – 提取數(shù)組的指定屬性

    jq '[.data.results[]|{id:topicId,count:viewCount}]' hjsource.json – 提取數(shù)組的指定屬性并重命名

    注意:

    上述最后兩個示例
    先將JSON對象數(shù)組轉化成JSON對象流, 再對各元素進行處理, 再組裝成JSON對象數(shù)組


    3. 重組


    • 場景: 重組成對象
  • 使用方法一: 組裝時僅復用value
  • jq '{simpleName:.[0].name,postUrl:.[0].url}' json.txt , 得到結果 :

    {"simpleName": "站長工具","postUrl": "http://tool.chinaz.com" }

    比較下和jq '.[]|{simpleName:.name,postUrl:.url}' json.txt 的區(qū)別.

    (前者處理單個對象, 后者處理JSON對象流)


  • 使用方法二: 組裝時復用整個key-value
  • 運行jq '.[0]|{name,url}' json.txt , 得到結果:

    {"name": "站長工具","url": "http://tool.chinaz.com" }

    比較下和 jq '.[]|{name,url}' json.txt 的區(qū)別.

    (前者處理單個對象, 后者處理JSON對象流)


    注意:

  • 引用的key-value可以是基本屬性節(jié)點, 也可以是對象節(jié)點.

    如運行jq '.[0]|{name,address}' json.txt

  • 復用key-value時表達式前面沒有.前綴, 僅復用value時才有.前綴

  • 用,分隔的多個表達式沒必要任何關系, 層次也可不一樣


    • 場景: 重組成數(shù)組

    在表達式外邊套上[], 即可組裝成數(shù)組. 根據組合元素的不同, 可以分以下三類:

  • 重組的元素可以是基本屬性, 組合結果是組裝成基本屬性的數(shù)組
  • 重組的元素可以是單個json對象, 組合結果是在外面套個數(shù)組結果
  • 重組的元素可以是單個JSON對象流, 組合結果是轉化成JSON對象數(shù)組
  • 有些情況下JSON對象流無法轉換成JSON數(shù)組, 通過sed命令轉換
    jq '.' | sed 's/^\}/\},/' | sed '1s/.*/\[\{/' | sed '$s/.*/\}\]/

  • 重組元素為基本屬性
  • 運行 jq '[.[0].name,.[0].url]' json.txt, 得到結果:

    ["站長工具","http://tool.chinaz.com" ]
  • 重組元素為單個json對象
  • 運行 jq '[.[0].address]' json.txt , 得到結果:

    [{"city": "廈門","country": "中國"} ]

    運行 jq '[.[0].arrayBrowser]' json.txt , 得到結果:

    [[{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}] ]
  • 重組元素為JSON對象流
  • jq '[.[]|.arrayBrowser[]]' json.txt, 得到結果:

    [{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"},{"name": "360","url": "http://www.so.com"},{"name": "bing","url": "http://www.bing.com"} ]

    4. 管道的使用


    管道|的作用, 把管道前的處理結果作為管道后面處理的輸入. 相當于管道前后各運行一次jq命令. (管道可以多次使用)

    用法和前面的沒有區(qū)別. 略


    5. 內置函數(shù)的使用


    • 獲取json對象的所有key組成的數(shù)組

    命令格式: jq keys , 表達式只能是keys , 不能包含其他語法, 如果需要獲取嵌套對象keys, 通過管道即可.

    運行 jq '.[0]|keys' json.txt , 得到結果:

    ["address","arrayBrowser","name","url" ]
    • 獲取length

    命令格式: jq length , 表達式只能是length , 不能包含其他語法, 如果需要獲取嵌套對象length, 通過管道即可.

  • 如果處理對象是基本屬性, 則length返回其字符個數(shù). 如jq '.[0].name|length' json.txt , 結果為4.

  • 如果處理對象是json對象, 則length返回其屬性個數(shù). 如jq '.[0].address|length' json.txt, 返回2.

  • 如果處理對象是數(shù)組, 則length返回數(shù)組的長度. 如jq '.[0].arrayBrowser|length' json.txt , 得到2.


    • 刪除某屬性

    命令格式: jq del(屬性表達式) , 一般結合管道使用

    該屬性可以是基本屬性, 或json對象, 或數(shù)組

    運行 jq '.[0]|del(.address)|del(.arrayBrowser)' json.txt , 得到結果:

    {"name": "站長工具","url": "http://tool.chinaz.com" }
    • 設置元素值

    命令格式: jq 屬性表達式=新的值' , 一般結合管道使用

    新的值可以是基本屬性, json對象, 數(shù)組.(雙引號不能省略)

    運行 jq '.[0]|.name="myTool"' json.txt, 得到結果:

    {"name": "myTool","url": "http://tool.chinaz.com","address": {"city": "廈門","country": "中國"},"arrayBrowser": [{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}] }
    • 增加屬性

    命令格式: jq 屬性表達式+{新的節(jié)點} , 一般結合管道使用

    其中屬性表達式的結果必須為對象

    新的節(jié)點只能是基本屬性, 不能是對象, 數(shù)組.

    運行jq '.[0].address+{version:"1.0"}' json.txt, 得到結果:

    {"city": "廈門","country": "中國","version": "1.0" }
    • 判斷是否有某屬性
      jq '.[0]|has("name")' json.txt, 返回結果為true
      jq '.[]|.arrayBrowser[]|has("name")' json.txt #判斷單個屬性
      jq '.[]|.arrayBrowser[]|{a:has("sign"),b:has("name")}' json.txt #判斷多個屬性并組裝成JSON對象
  • 其中屬性要用""包裹
  • 只能判斷子屬性, 不能判斷后代屬性
  • 處理源可以為JSON對象和JSON對象流

  • 四. 示例文件json.txt

    [{"name": "站長工具","url": "http://tool.chinaz.com","address": {"city": "廈門","country": "中國"},"arrayBrowser": [{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}]},{"name": "站長之家","url": "http://tool.zzhome.com","address": {"city": "大連","country": "中國"},"arrayBrowser": [{"name": "360","url": "http://www.so.com"},{"name": "bing","url": "http://www.bing.com"}]} ]

    總結

    以上是生活随笔為你收集整理的处理JSON最强命令jq使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。