<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python中jmespath解析提取json數(shù)據(jù)

          共 10237字,需瀏覽 21分鐘

           ·

          2021-11-14 10:50

                

                  在做接口自動化,測試斷言時,我們經(jīng)常需要提取接口的的響應(yīng)數(shù)據(jù)字段,以前用過jsonpath,有幾篇相關(guān)文章,可以參考下(Python深層解析json數(shù)據(jù)之JsonPath【Jmeter篇】后置處理器之正則提取器、Json提取器 、Jmeter之json提取器實戰(zhàn)(二)Jmeter之json條件提取實戰(zhàn)(三) )今天我們來介紹下jmespath用法,可以幫我們進行數(shù)據(jù)的靈活提取,下面通過案例來說明jmespath在python的使用。

          jmespath官方文檔

          https://jmespath.org/tutorial.html#projections

          jmespath安裝

          pip install jmespath

          字典,通過key名稱提取

          import jmespathdict_1 = {"a": "foo", "b": "bar", "c": "baz"}print(jmespath.search("c",dict_1))
          baz

          嵌套字典,層級提取

          import jmespathdict_1 = {"a": {"b": {"c": {"d": "value"}}}}print(jmespath.search("a.b.c.d",dict_1))
          value
          import jmespathdict_1 = {"a": {"b": {"c": {"d": "value"}}}}print(jmespath.search("a.b.c",dict_1))
          {'d': 'value'}

          列表,通過索引提取

          import jmespathlist_1 = ["a", "b", "c", "d", "e", "f"]print(jmespath.search("[1]",list_1))
          b

          列表、字典嵌套提取

          import jmespathsource = {"a": {  "b": {    "c": [      {"d": [0, [1, 2]]},      {"d": [3, 4]}    ]  }}}print(jmespath.search("a.b.c[0].d[1][0]",source))
          1

          切片提取列表中值

          import jmespathsource = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]print(jmespath.search("[0:5]",source))
          [0, 1, 2, 3, 4]
          import jmespathsource = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]print(jmespath.search("[5:10]",source))
          [5, 6, 7, 8, 9]
          import jmespathsource = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]print(jmespath.search("[:5]",source))
          [0, 1, 2, 3, 4]
          import jmespathsource = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]print(jmespath.search("[::2]",source))
          [0, 2, 4, 6, 8]

          列表取值使用 * 通配符

          1、取出列表中所有 first對應(yīng)的值

           people[*].first

          import jmespathsource = {  "people": [    {"first": "James", "last": "d"},    {"first": "Jacob", "last": "e"},    {"first": "Jayden", "last": "f"},    {"missing": "different"}  ],  "foo": {"bar": "baz"}}print(jmespath.search("people[*].first",source))
          ['James', 'Jacob', 'Jayden']

          2、取出列表中前2個first 對應(yīng)的值

          people[:2].first

          import jmespathsource = {  "people": [    {"first": "James", "last": "d"},    {"first": "Jacob", "last": "e"},    {"first": "Jayden", "last": "f"},    {"missing": "different"}  ],  "foo": {"bar": "baz"}}print(jmespath.search("people[:2].first",source))
          ['James', 'Jacob']

          對象取值使用 * 通配符

          取出ops 對象的任意屬性對應(yīng)的numArgs值 ops.*.numArgs

          import jmespathsource = {  "ops": {    "functionA": {"numArgs": 2},    "functionB": {"numArgs": 3},    "functionC": {"variadic": 1}  }}print(jmespath.search("ops.*.numArgs",source))
          [2, 3]

          子查詢使用 * 通配符

          在查詢的結(jié)果中繼續(xù)使用 * 通配符,查詢的結(jié)果是列表的列表

          import jmespathsource = {  "reservations": [    {      "instances": [        {"state": "running"},        {"state": "stopped"}      ]    },    {      "instances": [        {"state": "terminated"},        {"state": "running"}      ]    }  ]}print(jmespath.search("reservations[*].instances[*].state",source))
          [['running', 'stopped'], ['terminated', 'running']]

          我們希望結(jié)果為[“ running”, “ stopped”, “ terminated”, “ running”]一個狀態(tài)列表,可以使用 [] 而不是 [*]

          print(jmespath.search("reservations[].instances[].state",source))
          ['running', 'stopped', 'terminated', 'running']

          過濾器使用

          過濾器表達式是為數(shù)組定義的,其一般形式為 [?<表達式> <比較器> <表達式>]。

          常用的比較表達式可以使用 ==, !=, <, <=, >, > =

          假設(shè)我們有一個設(shè)備列表,每個設(shè)備都有一個名稱和一個 state。我們想要所有正在運行的計算機的名稱

          import jmespathsource = {  "machines": [    {"name": "a", "state": "running"},    {"name": "b", "state": "stopped"},    {"name": "b", "state": "running"}  ]}print(jmespath.search("machines[?state=='running'].name",source))
          ['a', 'b']

          管道表達式

          前面在匹配list里面的多個值時候,查詢的結(jié)果是一個list,如果我想取出結(jié)果里面的第一個可以使用管道符 |

          取出people下所有對象的 first 屬性,從結(jié)果里面取第一個值:people[*].first | [0]

          import jmespathsource = {  "people": [    {"first": "James", "last": "d"},    {"first": "Jacob", "last": "e"},    {"first": "Jayden", "last": "f"},    {"missing": "different"}  ],  "foo": {"bar": "baz"}}print(jmespath.search("people[*].first | [0]",source))
          James

          多選列表創(chuàng)建一個列表

          到目前為止,我們已經(jīng)研究了JMESPath表達式,這些表達式有助于將JSON文檔縮減為您感興趣的元素。下一個概念, 多選列表和 多選哈希允許您創(chuàng)建JSON元素。這使您可以創(chuàng)建JSON文檔中不存在的元素。多選列表創(chuàng)建一個列表,多選哈希創(chuàng)建一個JSON對象。

          這是一個多選列表的示例:people[].[name, state.name]

          import jmespathsource = {  "people": [    {      "name": "a",      "state": {"name": "up"}    },    {      "name": "b",      "state": {"name": "down"}    },    {      "name": "c",      "state": {"name": "up"}    }  ]}print(jmespath.search("people[].[name, state.name]",source))
          [['a', 'up'], ['b', 'down'], ['c', 'up']]


          在上面的表達式中,[name, state.name]部分是一個多選列表。它說要創(chuàng)建一個由兩個元素組成的列表,第一個元素是針對list元素評估名稱表達式的結(jié)果,第二個元素是對state.name評估的結(jié)果。因此,每個列表元素將創(chuàng)建一個兩個元素列表,并且整個表達式的最終結(jié)果是兩個元素列表的列表。

          與投影不同,即使結(jié)果為null,也始終包含表達式的結(jié)果。如果將以上表達式更改為people []。[foo, bar],則每個兩個元素列表將為[null, null]。

          多重選擇具有與多重選擇列表相同的基本概念,不同之處在于它會創(chuàng)建哈希而不是數(shù)組。使用上面的相同示例,如果我們想創(chuàng)建一個具有兩個鍵Name和 State的兩個元素哈希,則可以使用以下代碼:

          import jmespathsource = {  "people": [    {      "name": "a",      "state": {"name": "up"}    },    {      "name": "b",      "state": {"name": "down"}    },    {      "name": "c",      "state": {"name": "up"}    }  ]}print(jmespath.search("people[].{Name: name, State: state.name}",source))
          [{'Name': 'a', 'State': 'up'}, {'Name': 'b', 'State': 'down'}, {'Name': 'c', 'State': 'up'}]

          函數(shù)的使用

          JMESPath支持函數(shù)表達式,例如:length(people)

          import jmespathsource = {  "people": [    {      "name": "b",      "age": 30,      "state": {"name": "up"}    },    {      "name": "a",      "age": 50,      "state": {"name": "down"}    },    {      "name": "c",      "age": 40,      "state": {"name": "up"}    }  ]}print(jmespath.search("length(people)",source))
          3

          函數(shù)可用于以強大的方式轉(zhuǎn)換和過濾數(shù)據(jù)。可以在此處找到函數(shù)的完整列表,并且 函數(shù)表達式規(guī)范具有完整的詳細信息。

          以下是一些功能示例。

          本示例在people數(shù)組中打印最老的人的名字:

          import jmespathsource = {  "people": [    {      "name": "b",      "age": 30    },    {      "name": "a",      "age": 50    },    {      "name": "c",      "age": 40    }  ]}print(jmespath.search("max_by(people, &age).name",source))
          a

          函數(shù)也可以與過濾器表達式組合。在下面的示例中,JMESPath表達式在myarray中查找包含字符串foo的所有元素。

          import jmespathsource = {  "myarray": [    "foo",    "foobar",    "barfoo",    "bar",    "baz",    "barbaz",    "barfoobaz"  ]}print(jmespath.search("myarray[?contains(@, 'foo') == `true`]",source))
          ['foo', 'foobar', 'barfoo', 'barfoobaz']


          場景一,接口響應(yīng)數(shù)據(jù),提取code、msg、status字段進行斷言

          source = {  "code": 0,  "msg": "成功",  "trace": "ad12de4",  "data": {    "total": 205,    "list": [{      "id": 15000087,      "name": "促銷員",      "job_nature": 2,      "category_id": 61,      "user_id": 589601,      "company_id": 5084,      "group_id": 5084,      "status": 4,      "audit_type": 0,      "company_name": "二十二門店",      "job_nature_zh": "兼職",      "salary_zh": "1000元\/時",      "show_status": 5,      "manage_status_reason": "",      "status_zh": "停招",      "browse_users_num": 0,      "communication_users_num": 0,      "sign_up_users_num": 0,      "job_card_time_remaining": 22,      "job_top_card_time_remaining": 0    }, {      "id": 15000078,      "name": "促銷員",      "job_nature": 1,      "category_id": 61,      "user_id": 589601,      "company_id": 1000064,      "group_id": 5084,      "status": 4,      "audit_type": 100,      "company_name": "二十二門店",      "job_nature_zh": "全職",      "salary_zh": "2000-3000元\/月",      "show_status": 6,      "manage_status_reason": "",      "status_zh": "停招",      "browse_users_num": 0,      "communication_users_num": 0,      "sign_up_users_num": 0,      "job_card_time_remaining": 0,      "job_top_card_time_remaining": 0    }, {      "id": 15000077,      "name": "促銷員",      "job_nature": 1,      "category_id": 61,      "user_id": 589601,      "company_id": 5084,      "group_id": 5084,      "status": 4,      "audit_type": 100,      "company_name": "二十二門店",      "job_nature_zh": "全職",      "salary_zh": "2000-3000元\/月",      "show_status": 2,      "manage_status_reason": "",      "status_zh": "停招",      "browse_users_num": 0,      "communication_users_num": 0,      "sign_up_users_num": 0,      "job_card_time_remaining": 0,      "job_top_card_time_remaining": 0    }, {      "id": 13076362,      "name": "收銀員",      "job_nature": 2,      "category_id": 97,      "user_id": 589601,      "company_id": 5084,      "group_id": 5084,      "status": 4,      "audit_type": 1,      "company_name": "二十二門店",      "job_nature_zh": "兼職",      "salary_zh": "1000元\/時",      "show_status": 2,      "manage_status_reason": "",      "status_zh": "停招",      "browse_users_num": 0,      "communication_users_num": 0,      "sign_up_users_num": 0,      "job_card_time_remaining": 0,      "job_top_card_time_remaining": 0    }, {      "id": 13076361,      "name": "品類管理",      "job_nature": 1,      "category_id": 102,      "user_id": 589601,      "company_id": 5084,      "group_id": 5084,      "status": 1,      "audit_type": 1,      "company_name": "二十二門店",      "job_nature_zh": "全職",      "salary_zh": "2000-3000元\/月",      "show_status": 1,      "manage_status_reason": "",      "status_zh": "招聘中",      "browse_users_num": 3,      "communication_users_num": 1,      "sign_up_users_num": 1,      "job_card_time_remaining": 342,      "job_top_card_time_remaining": 0    }]  }}
          print(jmespath.search("code",source)) # 0print(jmespath.search("msg",source)) # 成功print(jmespath.search("data.list[].status",source)) # [4, 4, 4, 4, 1]

          場景二,接口響應(yīng)數(shù)據(jù),提取列表類模塊某字段進行斷言

          import jmespathsource = [{  "Name": "晨練指數(shù)",  "ID": 100,  "Ascending": 1,  "LocalDateTime": "2021-11-11T07:00:00+08:00",  "EpochDateTime": 1636585200,  "Value": 4.0,  "Category": "不宜",  "CategoryValue": 4,  "MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn",  "Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"}, {  "Name": "穿衣指數(shù)",  "ID": 101,  "Ascending": 1,  "LocalDateTime": "2021-11-11T07:00:00+08:00",  "EpochDateTime": 1636585200,  "Value": 5.0,  "Category": "初冬裝",  "CategoryValue": 5,  "MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn",  "Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"}, {  "Name": "感冒指數(shù)",  "ID": 102,  "Ascending": 1,  "LocalDateTime": "2021-11-11T07:00:00+08:00",  "EpochDateTime": 1636585200,  "Value": 2.0,  "Category": "較易發(fā)",  "CategoryValue": 2,  "MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn",  "Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"}]
          print(jmespath.search("[].Name",source)) 
          ['晨練指數(shù)', '穿衣指數(shù)', '感冒指數(shù)']


          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  伊伊色综合 | 久久精品苍井空免费一区 | 精品无码一区二区 | 天天爽夜夜爽人人爽 | 91精品日产一二三区乱码 |