【问题标题】:Extracting JSON value from key从键中提取 JSON 值
【发布时间】:2020-05-03 14:13:14
【问题描述】:

我有一个这样的 JSON 对象,我需要使用 id 提取任何对象的 name 值。我已经尝试了许多不同的迭代,但我似乎无法得到任何工作。任何一般的指针将不胜感激。谢谢。

{
  "weeks":[
    {
      "1":[
        {
          "name":"Stackoverflow Question",
          "description":"Have you ever asked a question on StackoverFlow?",
          "date":"11/25/2019",
          "id":"whewhewhkahfasdjkhgjks"
        },
        {
          "name":"I Can't Believe It's Not Butter!",
          "description":"Can you believe it? I sure can't.",
          "date":"11/25/2019",
          "id":"agfasdgasdgasdgawe"
        }
      ]
    },
    {
      "2":[
        {
          "name":"Hello World",
          "description":"A hello world.",
          "date":"12/02/2019",
          "id":"aewgasdgewa"
        },
        {
          "name":"Testing 123",
          "description":"Sometimes people don't say it be like it is but it do.",
          "date":"12/04/2019",
          "id":"asdgasdgasdgasd"
        }
      ]
    }
  ]
}

【问题讨论】:

  • 向我们展示您迄今为止的尝试!
  • 你真的把这个 JSON 对象转换成 Python 字典了吗?看看你的代码会很有帮助。
  • @KlausD。是的,我知道这是礼仪,我通常会这样做,问题是我刚刚尝试了各种零散的解决方案,然后将它们删除。道歉。

标签: python json


【解决方案1】:

结构是固定的,还是 JSON 的深度可以与示例不同?

如果有更多或更少的层次结构,这个也可以工作。 它基本上在类 JSON 结构内的每个字典中搜索 field_name 并返回参数 output_name 的值。

也许当你的数据结构发生变化时它会帮助你:)

data = {
  "weeks":[
    {
      "1":[
        {
          "name":"Stackoverflow Question",
          "description":"Have you ever asked a question on StackoverFlow?",
          "date":"11/25/2019",
          "id":"whewhewhkahfasdjkhgjks"
        },
        {
          "name":"I Can't Believe It's Not Butter!",
          "description":"Can you believe it? I sure can't.",
          "date":"11/25/2019",
          "id":"agfasdgasdgasdgawe"
        }
      ]
    },
    {
      "2":[
        {
          "name":"Hello World",
          "description":"A hello world.",
          "date":"12/02/2019",
          "id":"aewgasdgewa"
        },
        {
          "name":"Testing 123",
          "description":"Sometimes people don't say it be like it is but it do.",
          "date":"12/04/2019",
          "id":"asdgasdgasdgasd"
        }
      ]
    }
  ]
}

def extract_name(data, field_name: str, matching_value: str, output_name: str):
    """

    :param data: json-like datastructure in which you want to search
    :param field_name: the field name with which you want to match
    :param matching_value: the value you want to match
    :param output_name: the name of the value which you want to get
    :return:
    """
    if isinstance(data, list):
        for item in data:
            res = _inner_extract_name(item, field_name, matching_value, output_name)
            if res is not None:
                return res
    elif isinstance(data, dict):
        for item in data.values():
            res = _inner_extract_name(item, field_name, matching_value, output_name)
            if res is not None:
                return res


def _inner_extract_name(item, field_name, matching_value, output_name):
    if isinstance(item, dict):
        res = extract_name(item, field_name, matching_value, output_name)
        if field_name in item:
            if item[field_name] == matching_value:
                if output_name in item:
                    return item[output_name]
    else:
        res = extract_name(item, field_name, matching_value, output_name)
    return res


if __name__ == "__main__":
    name = extract_name(data, "id", "aewgasdgewa", "name")
    print(name)
``

【讨论】:

    【解决方案2】:

    希望你需要根据id找到名字,然后试试下面的代码,

    def get_name(data, id):
        for week in data['weeks']:
            for i in week:
                for j in week[i]:
                    if j['id'] == id:
                        return j['name']
        return None
    
    get_name(data, 'asdgasdgasdgasd')
    

    输出

    'Testing 123'
    

    【讨论】:

    • 现在试试这个。
    【解决方案3】:

    不确定这是不是你要找的东西

    for week in a["weeks"]:
        for k, v in week.values():
            print(v['name'])
    

    考虑到你的字典变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2019-10-20
      • 2021-08-26
      • 2020-05-11
      • 1970-01-01
      相关资源
      最近更新 更多