【问题标题】:Converting a list of dicts into dict of dicts to send a "complex" json to cloudant将 dicts 列表转换为 dicts 的 dict 以将“复杂”json 发送到 cloudant
【发布时间】:2017-05-17 17:45:44
【问题描述】:

大家好,2017 年好!

我无法将安静的复杂 json 发送到 cloudant 数据库。 据我了解(因为我是一个完全的新手,所以它并不是很远),使用 cloudant for python 在 cloudant DB 上发送文件的唯一方法是创建一个变量“数据”

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

并使用命令

my_document = my_database.create_document(data)

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

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

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

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

在 dicts 中有奇妙的 dicts :-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 " 属性错误)

我在溢出帖子上看到了一个解决方案:Python dump dict to json file

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

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

很抱歉,很长的帖子和非常无聊的问题,但我就像鲸鱼海洋中的浮游生物,这不是一个好的情况:-p

非常感谢。

【问题讨论】:

  • 请出示您尝试过的代码,以便您在这里获得帮助
  • 对 Cloudant 一无所知,但 documentation 表示,除了强制性的 _id_rev 字段外,文档可以包含您想要的任何其他 JSON。那么像{ "_id": "foo", "_rev": "bar", "my_array": [ ... ] } 这样的东西不是更好吗?
  • @SivaCn 完成,这应该可以工作,因为这是我在使用套接字进行训练时所做的,我曾经将 json 作为字符串加载和转储以通过套接字发送。
  • @ThisSuitIsBlack 不是你的意思是建立一个字典: data = { "_id": "killme", "my_array" : the_json_list_of_dicts }
  • @Manu 是的,没错。这样您就不必更改数据结构,只需将其嵌套在字典中即可。

标签: python json python-2.7 dictionary cloudant


【解决方案1】:

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

【讨论】:

  • 我必须保留这个结构,因为它是一个模拟场景,其中 json 的每个元素都经过一个模板,然后程序使用模板的 var 创建一个发送到 mqtt 代理的有效负载:/我是一个初学者,这听起来很疯狂,但感谢您的评论,我会尝试并与您保持联系:)
【解决方案2】:

您需要在一次调用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()

【讨论】:

  • 显然还有一种方法可以使用bulk operations 一次创建多个文档。
  • 是的,我应该这样做,因为每个字典中的每个数据都是特定于设备的,我不能分隔设备:/
  • 好的,非常感谢 Simon 和 @ThisSuitIsBlackNot 它看起来可以正常工作,而且,一旦文件上传,我可以编辑它,哈哈 :-) 晚上好!
  • 它适用于没有批量的常规命令(这很好,因为我还不知道批量)而且加载回 json 更容易,因为它只是一个键的值,太棒了 ^_ ^ 再次感谢您!
猜你喜欢
  • 2013-05-25
  • 2016-11-17
  • 2014-12-17
  • 1970-01-01
  • 2021-07-25
  • 2020-10-15
  • 2013-03-05
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多