2017-01-03 3 views
0

皆さんにこんにちはいい年!dictsのリストをdictsのdictsに変換して "複雑な" jsonをクラウドに送る

私は穏やかな複雑なjsonを雲のDBに送るのに問題があります。私の知る限り理解し (と私は合計初心者だから、それは本当に遠くありません)、Python用cloudantでcloudant DB上のファイルを送信する唯一の方法は、変数「データ」を作ることです

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

とコマンド正常にDB内のファイルを作成

my_document = my_database.create_document(data) 

を使用します。

しかし、somepointで.create_document()メソッドがキーと値を抽出しようとしているため、彼にリストを渡すとワイルドになるので、 コンソールエラーへのリンク:https://www.jepix.fr/images/cloudanterror.png

が、それは私が彼を与えるためにしようと定期的なリストではありません、それは私が、私は必要だと思う:-D dicts内部素晴らしいdictsと

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

:-) dictsの壮大なリストですdictsのリストをdictsとdictictの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.load/.loads/.dump/.dumpsでpythonのjsonライブラリを試しましたが、それはjsonを文字列に変換するのと同じ問題です"str"オブジェクトに "get"属性のエラーはありません)

オーバーフローポストの解決策を見ました:Python dump dict to json file

しかし、私はjsonを読んで、dictを記入するように、反対をする必要がありますか? dict-fillingプロセスがdict階層を緩めることができるので、私はそれが賢明な動きではないと思います...

dictsのリストをdictsのdictに変換する良い方法があればとても素敵です!

長い記事のため申し訳ありませんが、非常にnoobish疑問が、私はクジラの海でプランクトンのようだと

はどうもありがとうございました:-Pそれは良い状況ではありません。

+1

uはについて何も知らないここ –

+0

を助けを得ることができるように、あなたがしようとしているコードを表示してくださいCloudandですが、[documentation](https://docs.cloudant.com/document.html)には、必須の '_id'フィールドと' _rev'フィールドの他に、必要な他のJSONだけをドキュメントに入れることができます。 '{" _id ":" foo "、" _rev ":" bar "、" my_array ":[...]}のようなものはありません。 – ThisSuitIsBlackNot

+0

@SivaCn doneこれは、ソケットでトレーニングしていたときに行ったことで動作するはずです。ソケットを介して送信する文字列としてjsonをロードしてダンプすることがありました。 データ= { "_id": "killme"、 "my_arrayで":the_json_list_of_dicts } – Manu

答えて

0

create_document()関数の1回の呼び出しですべてのデータを作成する必要がありますか、複数回コールすることはできますか?2番目の手順を実行できる場合は、次のように記述します。

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

これにより、リスト内の各ドキュメントに対して1つのドキュメントが作成されます。 thissuitisblacknotによってコメントにフォローアップ

、あなたはこのような何かを行うことができるかもしれない:

+1

[一括操作](https://docs.cloudant.com)のやり方も明らかです。 /document.html#bulk-operations)を使用して複数のドキュメントを一度に作成できます。 – ThisSuitIsBlackNot

+0

はい私はそれぞれのdicts内の各データがデバイス固有のものであり、デバイスを分離できないためだと思います:/ – Manu

+0

ありがとう、サイモンと@ThisSuitIsBlackNotいいえ アップロードされています私はそれを編集することができますhaha :-) おはよう! – Manu

1

簡単ですが、非常に不必要なのは、リスト全体を囲むことだけです。 1つのキーと1つの要素を持つ辞書。その1つの要素はあなたのリストです...私はなぜあなたがこの構造を持っているのか、なぜこれが必要なのかを見ていないので、他の方法で助けてくれるのは難しいです。

+0

jsonの各要素がテンプレートを通過するシミュレーションシナリオであるので、この構造を維持する必要があります。テンプレートのvarは、プログラムによってmqttブローカーに送信されるペイロードを作成するために使用されます。/ 私はbegginerですあなたのコメントのおかげで、私はそれを試してあなたと連絡をとるつもりです:) – Manu

関連する問題