如何从python中的JSON列表中导出嵌套对象

时间:2019-03-13 08:57:49

标签: python json mongodb

我是MongoDB和JSON格式的新手。我在MongoDB集合中具有以下JSON格式。我想从每个内部对象中获取value2,value 4和value时间,并将其导出到CSV。同样,每个文档的内部对象数可以从1到4个对象变化。我该如何在python中做到这一点?

[{"object":[
    {"value1":number,
     "value2"":number,
     "value3"":number,
     "value4"":"code",
     "value5"":number,
     "value6"":"name"}
     ,
     {"value1":number,
      "value2":number,
      "value3":number,
      "value4":"code",
      "value5":number,
      "value6":"name"}]
     ,
 "time":1550666169274}]"""

1 个答案:

答案 0 :(得分:0)

欢迎堆栈溢出!

您的格式在语法上不正确。您还应该(根据规则)提供到目前为止您尝试过的示例。您是新手,因此您会获得通行证,但请记住以备将来=)

不清楚您要问什么。似乎有两个问题-1.如何访问和捕获数据结构中的数据,2.如何将捕获的数据写入csv。

要回答第一部分(访问和捕获数据): 您有列表和字典。要访问列表中的值,请使用后面的值的索引号(第一个索引号以0开头)。

例如如果我有列表l = ['zero', 'one', 'two'],则可以通过执行l[1]来访问字符串'one',其中1是列表l中索引'one'的编号。

要访问词典中的某些内容,可以使用其键。 例如。 d = {'key': 'value'} 使用d['key']来获取对应的值-'value'

因此,假设您的数据实际上是这样的:

my_json = [
  {
    "object":[
      {
        "value1":1,
        "value2":1,
        "value3":1,
        "value4":"code",
        "value5":1,
        "value6":"name"
      },
      {
        "value1":1,
        "value2":1,
        "value3":1,
        "value4":"code",
        "value5":1,
        "value6":"name"
      }
    ],
    "time":1550666169274
  }
]

您拥有的是一个包含字典的列表; “对象”键的值是包含字典的列表,“时间”键的值是字符串。

因此您可以像这样访问数据:

my_json[0]
>>> {'object': [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}], 'time': 1550666169274}

或者,如果列表中有多个对象,则可以遍历这样有用的对象列表):

for i in range(len(my_json)):
  my_json[i]
>>> {'object': [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}], 'time': 1550666169274}

my_json[0]是字典-这样您就可以访问它的值(字典列表):

my_json[0]['object']
>>> [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}]

my_json[0]['time']
>>> 1550666169274

这是一个列表,因此再次使用索引:

my_json[0]['object'][0] # or iterate through the list of objects as above
>>> {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}

为您提供字典,因此请使用它的密钥:

my_json[0]['object'][0]['value2']
>>> 1

依此类推...

由于“每个文档的内部对象的数量可以从1到4个对象变化”,因此您真的想遍历“对象”所包含的词典列表。您可以这样做:

all_docs = [] # create an empty list to hold further captured data

for obj in range(len(my_json)): # for each 'thing' in this list
  obj_time = my_json[obj]['time'] # grab the time
  values_sought = [] # create an empty list to hold further captured data

  for dictionary in my_json[obj]['object']: # for each 'thing' in the 'object''s list
    val_2 = dictionary['value2'] # grab the necessary values
    val_4 = dictionary['value4']
    values_sought.append((val_2, val_4)) # append them to the empty list above

  print(obj_time, values_sought)
  >>> 1550666169274 [(1, 'code'), (1, 'code')]

  all_docs.append((obj_time, values_sought)) # append each document's data to the all_docs list

print(all_docs)
>>> [(1550666169274, [(1, 'code'), (1, 'code')])]

假设您有两个文档(在顶层),all_docs看起来像这样:

[(1550666169274, [(1, 'code'), (1, 'code')])
 (1550666169275, [(1, 'code'), (1, 'code')]),]

现在您可以遍历此列表和类似这样的元组:

document_1 = all_docs[0]
document_1_data_all = all_docs[1]
document_1_data_1 = all_docs[1][0] # (or iterate)

document_2 = all_docs[1]

...等

第二部分,写入csv,取决于您希望格式化的方式。我建议您看看python内置的csv module

希望有帮助