欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

處理JSON最強命令jq使用場景

 更新時間:2023年07月14日 16:48:17   作者:2021不再有雨  
jq命令是處理json字符串的神器,?主要用于獲取JSON屬性/簡單重組JSON字符串,本章詳細介紹jq的主要應(yīng)用場景,感興趣的朋友跟隨小編一起看看吧

史上最全jq命令使用詳解

一. 前言

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

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

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

二. 語法

jq本身有一套完整語法,如要詳細掌握參考另外一篇總結(jié) jq詳細語法參考

1. 使用語法

jq 表達式 處理源

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

2. 概念理解

JSON對象

{開頭, 以}結(jié)尾的JSON字符串, 形如{}示例:

{
  "productId": "2048200008352211",
  "productName": "COACH蔻馳佩利系列 馬車標識米蘭編織鏈石英表"
}

JSON數(shù)組

[開頭, 以]結(jié)尾的JSON字符串, 元素間用,分隔包括基本數(shù)組和JSON對象數(shù)組, 形如[{},{},{}]

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

JSON對象流

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

根對象

是指jq命令當前處理的處理源的表達式引用, 在表達式中用.來表示

表達式/路徑

jq命令是基于表達式輸出結(jié)果的, 表達式可以通過.來訪問子屬性或子對象表達式的語法, 類似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ù)組元素, 結(jié)果為JSON對象流

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

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

  • ,:需要輸出多個表達式的結(jié)果用來拼接各表達式, 如 jq '.name,.address.city' json.txt
  • | : 管道, 相對于運行兩次jq命令, 前jq運行結(jié)果作為后jq的處理源根據(jù)前jq的運行結(jié)果數(shù)據(jù)類型分為:
  • JSON對象: 可簡化, 如jq '.[0]|.address' json.txtjq '.[0].address' json.txt
  • JSON對象數(shù)組: 后置表達式只能用內(nèi)置函數(shù), 如jq '.[0].arrayBrowser|length' json.txt
  • JSON對象流: 相當于對每個元素都運行后置表達式, 整體結(jié)果還是JSON對象流,如jq '.[0].arrayBrowser[]|.name' json.txt

注意:

要想對JSON對象數(shù)組每個元素進行處理, 必須先轉(zhuǎn)換成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ù)組的全部元素轉(zhuǎn)換成JSON對象流

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

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

注意:

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

3. 重組

場景: 重組成對象

使用方法一: 組裝時僅復(fù)用value

jq '{simpleName:.[0].name,postUrl:.[0].url}' json.txt , 得到結(jié)果 :

{
  "simpleName": "腳本之家",
  "postUrl": "//www.dbjr.com.cn"
}

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

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

2.使用方法二: 組裝時復(fù)用整個key-value

運行jq '.[0]|{name,url}' json.txt , 得到結(jié)果:

{
  "name": "腳本之家",
  "url": "//www.dbjr.com.cn"
}

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

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

注意:

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

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

復(fù)用key-value時表達式前面沒有.前綴, 僅復(fù)用value時才有.前綴

,分隔的多個表達式?jīng)]必要任何關(guān)系, 層次也可不一樣

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

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

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

1.重組元素為基本屬性

運行 jq '[.[0].name,.[0].url]' json.txt, 得到結(jié)果:

[
  "腳本之家",
  "//www.dbjr.com.cn"
]

2.重組元素為單個json對象

運行 jq '[.[0].address]' json.txt , 得到結(jié)果:

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

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

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

3.重組元素為JSON對象流

jq '[.[]|.arrayBrowser[]]' json.txt, 得到結(jié)果:

[
  {
    "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. 管道的使用

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

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

5. 內(nèi)置函數(shù)的使用獲取json對象的所有key組成的數(shù)組

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

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

[
  "address",
  "arrayBrowser",
  "name",
  "url"
]

獲取length

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

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

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

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

刪除某屬性

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

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

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

{
  "name": "腳本之家",
  "url": "//www.dbjr.com.cn"
}

設(shè)置元素值

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

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

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

{
  "name": "jb51",
  "url": "//www.dbjr.com.cn",
  "address": {
    "city": "廈門",
    "country": "中國"
  },
  "arrayBrowser": [
    {
      "name": "Google",
      "url": "http://www.google.com"
    },
    {
      "name": "Baidu",
      "url": "http://www.baidu.com"
    }
  ]
}

增加屬性

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

其中屬性表達式的結(jié)果必須為對象

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

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

{
  "city": "廈門",
  "country": "中國",
  "version": "1.0"
}

判斷是否有某屬性

jq '.[0]|has("name")' json.txt, 返回結(jié)果為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://jb51.net",
    "address": {
      "city": "廈門",
      "country": "中國"
    },
    "arrayBrowser": [
      {
        "name": "Google",
        "url": "http://www.google.com"
      },
      {
        "name": "Baidu",
        "url": "http://www.baidu.com"
      }
    ]
  },
  {
    "name": "腳本之家",
    "url": "http://jb51.net",
    "address": {
      "city": "大連",
      "country": "中國"
    },
    "arrayBrowser": [
      {
        "name": "360",
        "url": "http://www.so.com"
      },
      {
        "name": "bing",
        "url": "http://www.bing.com"
      }
    ]
  }
]

到此這篇關(guān)于處理JSON最強命令jq使用詳解的文章就介紹到這了,更多相關(guān)JSON命令jq使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論