用Python探索JSON數(shù)據(jù)

最近在接觸一些AI自動化的項目,發(fā)現(xiàn)幾乎所有的傳感器數(shù)據(jù)為了匹配API接口宫静,數(shù)據(jù)格式都是JSON。這個對與常年幾乎只用Data Frame的人來說一開始會很不習慣,稍微了解了一下python的遞歸函數(shù)摊鸡,發(fā)現(xiàn)用遞歸函數(shù)可以方便好多。
本文會分4步講解如何實現(xiàn)這個操作蚕冬。

Step.1 最簡單的遞歸函數(shù)

sample = ["a", "b", 1]
res = []
for v in sample:
    if isinstance(v, str):
        res.append(v)

print(res) # ["a", "b"]

尋找str構(gòu)造的數(shù)據(jù)免猾。
step.1純屬為了比較,無需多解釋囤热。

Step.2 雙層數(shù)據(jù)結(jié)構(gòu)的遞歸函數(shù)

sample = [["a", 1], "b"]

res = [] 
for arg in sample: 
  if isinstance(arg, str):
    res.append(arg)
  if isinstance(arg, list):
    for v in arg:
      if isinstance(v, str):
        res.append(v)

print(res)

step.2的話相當于把step.1拆分成了兩步猎提。雖然得到了預(yù)期的結(jié)果,但是用到了兩次if條件旁蔼,使得整個代碼變得有點冗長锨苏。如果需要有更多步驟的話疙教,會產(chǎn)生更多的for循環(huán)和if條件分叉,代碼會變得更加冗長伞租。 所以需要遞歸函數(shù)松逊。遞歸函數(shù)的宗旨就是把大事化小,把復(fù)雜的項目分割成簡單的小塊肯夏。在接下來的step.3里會用到遞歸函數(shù)把step.2簡單化经宏。

Step.3 從n層構(gòu)造序列里獲取str數(shù)據(jù)

sample = ["a",["b", 1, [[["c", 2], 3], 4], "d"], ["e"]]

想要預(yù)期得到的結(jié)果如下

["a", "b", "c", "d", "e"]
def get_str(arg):
  res = []
  if isinstance(arg,str):
    res.append(arg)
  elif isinstance(arg,list):
    for v in arg:
       res += get_str(v)
  return res

print(get_str(sample))

整個函數(shù)的運行從下往上看,首先運行的是

for v in arg:
    res += get_str(v)

當然此處的arg有三種情況驯击,分別是

①res += get_str("a")
②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
③res += get_str(["e"])

根據(jù)條件設(shè)定烁兰,每種情況的處理如下

①res += get_str("a")

情況1的話直接把結(jié)果添加到res里,到此結(jié)束
情況2的處理如下

②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
res += get_str("b")
res += get_str(1)
res += get_str([[["c", 2], 3], 4])
res += get_str("d")

可以看到處理的并不完整徊都,會繼續(xù)處理沪斟。
情況3的處理如下

③res += get_str(["e"])
res += get_str("e")

完整的內(nèi)部操作如下:

①res += get_str("a")
>> res.append("a") *
②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
>> res += get_str("b")
   >> res.append("b") *
   res += get_str(1)
   res += get_str([[["c", 2], 3], 4])
   >> res += get_str([["c", 2], 3)
      >> res += get_str(["c", 2])
         >> res += get_str("c")
            >> res.append("c") *
            res += get_str(2)
      res += get_str(4)
   res += get_str("d")
   >> res.append("d") *
③res += get_str(["e"])
>> res += get_str("e")
   >> res.append("e") *

其中帶*的結(jié)果會最終添加(return)到res里。用這樣的辦法就實現(xiàn)了使用get_str()函數(shù)在復(fù)雜的數(shù)據(jù)中尋找并添加str類型數(shù)據(jù)暇矫。和n個for循環(huán)比起來代碼更加簡潔明了主之。

Step.4 探索JSON

在復(fù)雜的JSON數(shù)據(jù)里尋找指定數(shù)據(jù)。假設(shè)在下面的例子里找到x,y,z

sample = {
    "a": [{
        "b": "y", 
        "c": [{
            "d": [2,3]
        }], 
        "e": {"g": "z"}
        }],
        "f": ["x"],
}
def get_str(arg):
    res =[]
    if isinstance(arg, str):
        res.append(arg)
    elif isinstance(arg, list):
        for item in arg:
            res += get_str(item)
    elif isinstance(arg, dict):
        for value in arg.values():
            res += get_str(value)
    return res

print(get_str(sample)) # ["x", "y", "z"]

原理是一樣的李根,無非就是和step3相比多了一個dict層槽奕。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市房轿,隨后出現(xiàn)的幾起案子粤攒,更是在濱河造成了極大的恐慌,老刑警劉巖囱持,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夯接,死亡現(xiàn)場離奇詭異,居然都是意外死亡纷妆,警方通過查閱死者的電腦和手機盔几,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掩幢,“玉大人逊拍,你說我怎么就攤上這事×r冢” “怎么了顺献?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枯怖。 經(jīng)常有香客問我注整,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任肿轨,我火速辦了婚禮寿冕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椒袍。我一直安慰自己驼唱,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布驹暑。 她就那樣靜靜地躺著玫恳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪优俘。 梳的紋絲不亂的頭發(fā)上京办,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音帆焕,去河邊找鬼惭婿。 笑死,一個胖子當著我的面吹牛叶雹,可吹牛的內(nèi)容都是我干的财饥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼折晦,長吁一口氣:“原來是場噩夢啊……” “哼钥星!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筋遭,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤打颤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漓滔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡乖篷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年响驴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撕蔼。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡豁鲤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲸沮,到底是詐尸還是另有隱情琳骡,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布讼溺,位于F島的核電站楣号,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炫狱,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一藻懒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧视译,春花似錦嬉荆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椅亚,卻和暖如春蝶锋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背什往。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工扳缕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人别威。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓躯舔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親省古。 傳聞我的和親對象是個殘疾皇子粥庄,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容