【问题标题】:Modify keys in nested dictionary to match for post修改嵌套字典中的键以匹配帖子
【发布时间】:2017-08-08 14:35:31
【问题描述】:

所以我对系统 A 运行 GET 并获得以下输出:

'{
  "comment": "A good object",
  "number": "1.1",
  "extra_stuff": {
        "extra_id": {"value": 100},
        "extra_name": {"value": "Test"},
        }
 }'

在我 POST 到系统 B 之前,我需要翻译(并省略)某些键(但保留值)。我想要从这个 GET 和翻译中得到的只是嵌套的字典键(extra_stuff 中的键)并且只有其中一个。

翻译:

mapping_dict = { 'extra_id': 'id' }
dict_to_post = { '#KEY extra_ID': #VALUE FROM extra_ID# :, 'name' : Test, 'other' : True }

我得到了一个翻译字典键的函数,来自另一个问题:

def update_dict_keys(obj, mapping_dict):
    if isinstance(obj, dict):
        return {mapping_dict[k]: update_dict_keys(v, mapping_dict) for k, v in obj.iteritems()}
    else:

        return obj

但我不确定如何仅将嵌套字典发送到该函数中,我似乎只将“主”字典放在那里。不知道最好的方法是什么。我还需要在另一篇文章中处理“主”字典中的信息。

【问题讨论】:

    标签: python api dictionary nested


    【解决方案1】:

    您确定吗,{"value": "Test"} 后面有一个,,因为这不是有效的json,并且您的 get 响应看起来像 json

    如果这只是您的帖子中的一个错误,您可以 使用json.loads() 从您的响应字符串中获取字典:

    import json
    
    res = '{
        "comment": "A good object",
        "number": "1.1",
        "extra_stuff": {
                "extra_id": {"value": 100},
                "extra_name": {"value": "Test"}
        }
    }'
    
    # convert to dict
    res_dict = json.loads(res)
    
    # do your mapping
    dict_to_post = { 'extra_id': res_dict['extra_stuff']['extra_id']['value']}
    
    # dict_to_post is {'extra_id': 100} now
    

    此外,我不明白您需要 mapping_dict 做什么。您想要 {'id': 100} 作为结果吗?

    【讨论】:

    • 对不起,错字!正在清理代码以使示例更简单。该映射用于更改 GET 字典的键名(带有键“extra_id”的嵌套字典),以便稍后匹配 POST 所需的键名。
    • 我在尝试转换时遇到了一些错误:res_dict = json.loads(res) File "/usr/lib64/python2.7/json/__init__.py", line 338, in loading return _default_decoder.decode(s) 文件“/usr/lib64/python2.7/json/decoder.py”,第 366 行,在 decode obj 中,end = self.raw_decode(s, idx=_w(s, 0).end ())
    • 如果它只是你在问题中所说的这一键,那么dict_to_post = { 'id': res_dict['extra_stuff']['extra_id']['value']} 就足够了,那么你就不需要匹配的字典了。如果您想匹配更多键,请告诉我,我会更新我的答案。对于您的堆栈跟踪:它并没有告诉我您是例外。
    • 我对此没有太多经验(如果这不是很明显:),这就是我尝试转换它之前 json 结果的样子(pprint):[{u'comment': u '一个好对象', u'extra_stuff': {u'extra_id': {u'value': u'100'}, u'extra_name': {u'value': 'Test'}}, u'number' : u'1.1'}]
    • 我希望映射是可调整的,这样我就可以调整映射字典中的键名以适应不同的场景,所以是的,它不仅仅是这个具体的例子。抱歉,错过了回溯:TypeError: expected string or buffer
    【解决方案2】:

    所以我发现我得到的响应已经被解码了!我遇到的问题是,解码后的响应是一个字典中包含字典的列表。

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 2018-09-13
      • 2021-10-20
      • 2018-07-10
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多