2017-01-03 2 views
0

Здравствуйте, добрый год 2017 всем!Преобразование списка dicts в dict of dicts для отправки «сложного» json to cloudant

У меня проблемы с отправкой тихого комплекса json в облачную БД. Насколько я понимаю (и это не очень далеко, потому что я всего новичку), единственный способ отправить файл на Cloudant БД с Cloudant для питона сделать переменную «данные»

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

и использовать команду

my_document = my_database.create_document(data) 

, которые успешно создать файл в БД.

BUT выглядит так, как будто все сложнее, когда данные не находятся внутри dict, потому что в какой-то момент метод .create_document() пытается извлечь ключи и значения, и это дико, когда вы даете ему список ссылка на ошибку консоли : https://www.jepix.fr/images/cloudanterror.png

, но это не обычный список, который я стараюсь дать ему, это великолепный список dicts :-)

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

с чудесной dicts внутри dicts :-D Я думаю, мне нужен способ конвертировать список dicts в dict of dicts и я АБСОЛЮТНО HA VE Чтобы сохранить эту структуру dict, потому что она используется шаблонами других коллег, парсером и т. Д., Или дно моего ученика будет беспощадно избито! отчаянного шаг

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(), но я получил ошибку аргумента, говоря мне, что я не достаточно аргумента для вызова этой функции (в этот момент я ужасно его принял и искал другой выход)

Я также попробовал json-библиотеку для python с json.load/.loads/.dump/.dumps, но это та же проблема, что и преобразование json в строку (повторение цикла на Объект «str» не имеет ошибки атрибута «get»)

Я видел, может быть, решение на переполнение: Python dump dict to json file

Но мне нужно сделать противоположное, например, прочитать json и заполнить диктофон? Я не думаю, что это самые умные шаги, так как процесс заполнения dict может потерять иерархию dict ...

Итак, если у вас есть хороший способ конвертировать список dicts в dict dicts, это будет будь так хорош!

Извините за длинный пост и очень noobish вопрос, но я как планктон в море китов, и это не очень хорошая ситуация :-p

Большое спасибо.

+1

Пожалуйста, покажите код, который вы пробовали, так что и может получить помощь здесь –

+0

Ничего не знаю о Cloudant, но в [documentation] (https://docs.cloudant.com/document.html) указано, что кроме обязательных полей '_id' и' _rev' документы могут содержать практически любой другой JSON, который вы хотите. Так что не будет что-то вроде '{" _id ":" foo "," _rev ":" bar "," my_array ": [...]}' будет лучше? – ThisSuitIsBlackNot

+0

@SivaCn сделано, это должно работать, потому что это то, что я сделал, когда тренировался с сокетом, я использовал для загрузки и сбрасывал json в виде строки, чтобы отправить ее через сокеты. – Manu

ответ

0

Вам нужно создать все данные в одном вызове функции 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() 
+1

Существует также, по-видимому, способ сделать [массовые операции] (https://docs.cloudant.com /document.html#bulk-operations) для создания сразу нескольких документов. – ThisSuitIsBlackNot

+0

Да, я должен, потому что каждая информация внутри каждого dicts специфична для устройства, и я не могу отделить устройства:/ – Manu

+0

Хорошо, спасибо вам большое, парни Simon и @ThisSuitIsBlackNot похоже, что это работает, и, кроме того, после того, как файл я могу отредактировать его haha ​​:-) Добрый вечер! – Manu

1

Простым, но совершенно ненужным было бы просто поставить dict по всему списку. Так что дикт с одним ключом и одним элементом. Этот один из элементов является вашим списком ... Я не понимаю, почему у вас есть эта структура, и почему это так, как должно быть, так что мне трудно помочь другим способом.

+0

Мне нужно сохранить эту структуру, потому что это сценарий моделирования, в котором каждый элемент json проходит через шаблон, а затем var var используется программой для создания полезной нагрузки, отправленной в mktt broker:/ Я начинаю и это звучит так сумасшедшим, чтобы быть на этом, но спасибо за ваш комментарий. Я собираюсь попробовать это и держать вас в курсе :) – Manu