【问题标题】:Fetch specific data from JSON从 JSON 中获取特定数据
【发布时间】:2016-03-10 16:46:26
【问题描述】:

我已经问过这个问题并阅读了很多 JSON 提取示例,但我仍然无法处理那个 JSON... :( 我试图只获取“addr_tag”数据而不获取任何其他信息,我可以轻松获取一些其他信息,但我不知道获取“addr_tag”的正确语法

谢谢!

import json
from urllib.request import urlopen


js1 = urlopen("https://blockchain.info/address/1dice97ECuByXAvqXpaYzSaQuPVvrtmz6?format=json&limit=1").read().decode('utf8')
obj1 = json.loads(js1)

print (obj1['txs']) #I need to know the what to put here instead of 'txs'... 

谢谢!

【问题讨论】:

    标签: python json api python-3.x url


    【解决方案1】:

    它嵌套很深,txs 是外键,txs 的值是一个列表,它有一个带有 inputs 的字典,其值也是一个包含字典的列表,在该字典内 @987654326 @ 有一个 dict 作为具有 addr_tagkey 的值:

    print(obj1["txs"][0]["inputs"][0]["prev_out"]["addr_tag"])
    

    第二个在下面的json中实际上有2个addr_tags

    print(obj1["txs"][0]["out"][1]["addr_tag"])
    
    Satoshi Dice Change Address
    

    如果键不总是在那里,你可以使用 dict.get:

    inter = js["txs"][0]
    k1 = next((d["prev_out"].get("addr_tag") for d in inter["inputs"] if "prev_out" in d), None)
    k2 = next((d.get("addr_tag") for d in inter["out"] if "addr_tag" in d), None)
    

    如果您的 json 中没有任何键,则该值为 None,因此您可以使用 if 进行检查:

     if k1 is not None:
         .......
     if k2 is not None:
          ................
    

    查看链接,数据和格式在每次运行中不断变化,此函数将递归检查所有字典并提取任何 "addr_tag" 值:

    def rec_get(d, k):
        if isinstance(d, dict):
            if k in d:
                yield d[k]
            else:
                for v in d.values():
                    yield from rec_get(v, k)
        elif isinstance(d, list):
            for v in d:
                yield from rec_get(v, k)
    
    
    print(list(rec_get(js, "addr_tag")))
    

    使用链接 json,你会得到它重复一些键,但你可以调用 set(.. 而不是列表:

    ['Satoshi Dice Change Address', 'Satoshi Dice Change Address', 'SatoshiDICE 50%', 'Satoshi Dice Change Address']
    

    【讨论】:

    • 好朋友!给我你的比特币地址,我可以捐给你:)
    • 嗨,还有一个小问题,假设我带来了一些其他的地址 JSON,比如这个 :(blockchain.info/address/…),如果 '('addr_tag',我如何“询问”JSON in (obj4)["txs"][0]["out"][1]' 是否有效?因为每个 JSON 都有不同的格式,我需要先“询问”他是否有 'addr_tag' 或不是...谢谢...
    • 所以它只是有时存在?
    • 是的,有时它打开 (obj1["txs"][0]["out"][0]["addr_tag"]) 有时它打开 (obj1["txs"][0 ]["out"][1]["addr_tag"])。问题是,当它不在他们两个中时,代码会因为他无法处理 [1] 而崩溃,他只是不认识他......就像在这个 JSON 中一样(blockchain.info/address/…
    • @Itsko,我添加了一个递归实现,它将搜索所有的 json,格式似乎一直在变化,所以这至少可以保证你得到所有的键
    猜你喜欢
    • 2019-03-30
    • 2023-03-04
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多