簡體   English   中英

詞典列表中的詞典列表的Glom規范

[英]Glom spec for list of dictionaries inside a list of dictionaries

我目前正在使用glom來解析JSON API響應,該響應除其他外返回字典列表以及其中的字典列表。 我遇到的問題是讓glom訪問正確的字典條目。

JSON示例:

{'answeredAt': '2019-08-23T21:11:04Z',
  'direction': 'Inbound',
  'disposition': 'Answered',
  'duration': 110867,
  'endedAt': '2019-08-23T21:12:55Z',
  'from': {'connectedAt': '2019-08-23T21:11:04Z',
   'departmentName': None,
   'deviceType': None,
   'disconnectedAt': '2019-08-23T21:12:55Z',
   'name': 'blah',
   'number': '1234567890',
   'number_e164': '1234567890',
   'serviceId': None,
   'userId': None},
  'initialQueueName': 'blah',
  'joinedLinkedIds': [],
  'legs': [{'departmentName': 'default',
    'deviceType': 'Unknown',
    'legType': 'Dial',
    'menuName': None,
    'menuOption': None,
    'menuPrompt': None,
    'number': '1234567890',
    'optionAction': None,
    'optionArg': None,
    'queueName': None,
    'serviceId': 327727,
    'timestamp': '2019-08-23T21:11:04Z',
    'userId': None},
   {'departmentName': 'default',
    'deviceType': 'Unknown',
    'legType': 'Answer',
    'menuName': None,
    'menuOption': None,
    'menuPrompt': None,
    'number': '1234567890',
    'optionAction': None,
    'optionArg': None,
    'queueName': None,
    'serviceId': 327727,
    'timestamp': '2019-08-23T21:11:04Z',
    'userId': None},
   {'departmentName': None,
    'deviceType': None,
    'legType': 'EnterIVR',
    'menuName': 'blah',
    'menuOption': None,
    'menuPrompt': None,
    'number': None,
    'optionAction': None,
    'optionArg': None,
    'queueName': None,
    'serviceId': None,
    'timestamp': '2019-08-23T21:11:05Z',
    'userId': None},
   {'departmentName': None,
    'deviceType': None,
    'legType': 'IVRSchedule',
    'menuName': 'Day',
    'menuOption': None,
    'menuPrompt': None,
    'number': None,
    'optionAction': None,
    'optionArg': None,
    'queueName': None,
    'serviceId': None,
    'timestamp': '2019-08-23T21:11:06Z',
    'userId': None},
   {'departmentName': None,
    'deviceType': None,
    'legType': 'EnterQueue',
    'menuName': None,
    'menuOption': None,
    'menuPrompt': None,
    'number': None,
    'optionAction': None,
    'optionArg': None,
    'queueName': 'blah',
    'serviceId': None,
    'timestamp': '2019-08-23T21:11:15Z',
    'userId': None},
   {'departmentName': None,
    'deviceType': None,
    'legType': 'Hangup',
    'menuName': None,
    'menuOption': None,
    'menuPrompt': None,
    'number': 'blah',
    'optionAction': None,
    'optionArg': None,
    'queueName': None,
    'serviceId': None,
    'timestamp': '2019-08-23T21:12:55Z',
    'userId': None}],
  'linkedId': 'some unique key',
  'startedAt': '2019-08-23T21:11:04Z',
  'to': {'connectedAt': '2019-08-23T21:11:04Z',
   'departmentName': 'default',
   'deviceType': 'Unknown',
   'disconnectedAt': '2019-08-23T21:12:55Z',
   'name': None,
   'number': '1234567890',
   'number_e164': '1234567890',
   'serviceId': 327727,
   'userId': None},
  'version': {'label': None, 'major': 4, 'minor': 2, 'point': 1}},

我想獲取的信息在“ legs”中,其中“ legType” ==“ Dial”或“ EnterIVR”。 我需要從“撥號”分支獲取“數字”,並從“ EnterIVR”分支獲取“ menuName”。 例如,我可以列出所有不同的legType,但不能列出那些數據。

這是我目前所在的位置:

with open('callstest.csv',mode='w') as calls:
    data_writer = csv.writer(calls, delimiter = ',')
    data_writer.writerow(['LinkedID','Number','Queue','Client'])
    target = response_json['calls']
    glomtemp = {}
    for item in target:
        spec = {
            'Linked ID':'linkedId',
            #this returns the number I need only in certain cases, 
            #so I need 'number' from the 'Dial' legType
            'Number': ('to', 'number') 
            'Queue': 'initialQueueName',
            'Client': #need help here, should be 'menuName' from
                      #'EnterIVR' legType
                }
        glomtemp = glom(item,spec)
        #print(glomtemp)
        data_writer.writerow([glomtemp['Linked ID'],glomtemp['Number'],glomtemp['Queue']])

現在,我可以讓他們和Coalesce一起退到“無”,但這不是我想要的。

關於如何指定此信息以從“數字”和“客戶”的那兩條腿中獲取信息的任何建議?

如果我理解正確,則想過濾掉某些不支持受支持的legType 您肯定會對Coalesce有所了解,我認為這里的關鍵是glom的Check指示符類型 ,結合SKIP單例 我必須稍微調整一下您當前的規格以匹配示例數據,但這可以運行:

from glom import glom, Check, Coalesce, SKIP

LEG_SPEC = {'Client': Coalesce('menuName', default=''),
            'Number': Coalesce('to.number', default=''),
            'Linked ID': 'serviceId',
            'Queue': 'queueName'}
entries_spec = ('legs', 
                [Check('legType', one_of=('Dial', 'EnterIVR'), default=SKIP)],
                [LEG_SPEC])
pprint(glom(target, entries_spec))
# prints:
# [{'Client': None, 'Linked ID': 327727, 'Number': '', 'Queue': None},
#  {'Client': 'blah', 'Linked ID': None, 'Number': '', 'Queue': None}]

不知道那是否正是您希望看到的,但是模式在那里。 我認為您需要為其他字段提供None (或'' ),因為您正在編寫的csv將要在這些列中添加一些內容。

還有其他使用glom進行濾波迭代的方法。 摘錄頁面有一個簡短的部分 ,並附有示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM