将字典列表转换为字典的字典,以将 "complex" json 发送到 cloudant

Converting a list of dicts into dict of dicts to send a "complex" json to cloudant

2017 年大家好!

我无法将安静的复合体 json 发送到 Cloudant 数据库。 据我了解(这并不遥远,因为我是一个新手),在 cloudant DB 上为 python 发送文件的唯一方法是创建一个变量 "data"

data = {
    '_ID': 'userInfo',
    'Name': 'Manu'
    'Age': 23,
    'Hobbies': ['cloudant', 'python', 'dockers']
    }

并使用命令

my_document = my_database.create_document(data)

在数据库中成功创建文件。

但是当数据不在字典中时,看起来一切都会变得更棘手,因为在某些时候 .create_document() 方法会尝试提取键和值,当你给他一个列表时它会变得疯狂 link 控制台错误:https://www.jepix.fr/images/cloudanterror.png

但这不是我试图给他的常规列表,而是一个宏伟的字典列表:-)

[
   {dict1},
   {dict2},
   {dict3},
   {dict4},
   { },
   { },
   { },
   { },
   { }
]

字典里有奇妙的字典:-D 我想我需要一种方法将字典列表转换为字典的字典,我绝对必须保留这个字典结构,因为它被其他同事的模板、解析器等使用,否则我徒弟的屁股会被无情地踢!

import cloudant
import json
from cloudant.client import Cloudant


client = Cloudant("USR", "PWD", url)
client.connect()

# Client tasks ##########################################
session = client.session()
print 'Username: {0}'.format(session['userCtx']['name'])
print 'Databases: {0}'.format(client.all_dbs())

my_db = client['scenario-json']

with open('scenarioGenerated.json', 'r') as fp:
    json_str = fp.read()

json_dict = json.loads(json_str)
my_doc = my_db.create_document(json_dict)



client.disconnect()

我已经尝试了完全新手的绝望举动,比如使用 dict() 函数将列表转换为 dict,但我收到一个参数错误,告诉我我没有足够的参数来调用这个函数(此时我非常接受它并搜索另一种出路)

我也用 json.load/.loads/.dump/.dumps 为 python 尝试了 json 库,但它与转换 json 的问题相同到一个字符串(在 "str" 对象上循环没有 "get" 属性错误)

我看到可能是关于溢出的解决方案 post:Python dump dict to json file

但我需要做相反的事情,比如阅读 json 并填写字典? 我不认为这是最聪明的举动,因为字典填充过程会松动字典层次结构...

所以 imo,如果你有一个很好的方法将字典列表转换成字典的字典,那就太好了!

很抱歉问了这么长的 post 和非常菜鸟的问题,但我就像鲸鱼海中的浮游生物,这不是一个好情况:-p

非常感谢。

简单但完全没有必要的是在整个列表周围放置一个命令。所以一个字典只有一个键和一个元素。那个元素就是你的列表......我不明白你为什么有这个结构,为什么它需要这样,所以我很难以任何其他方式提供帮助。

您需要在对 create_document() 函数的一次调用中创建所有数据,还是可以进行多次调用?如果你能做第二个,我会这样写:

documents = [ {dict1}, {dict2}, {dict3}, ...]
for document in documents:
    my_document = my_database.create_document(document)
    # Do some more processing.

这将为列表中的每个文档创建一个文档。

根据 thissuitisblacknot 的评论,您也许可以这样做:

documents = [ {dict1}, {dict2}, {dict3}, ...]
data = { "docs": documents }
my_database.bulk_create_document(data) # Guessed at bulk_create_document()