🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

1255閲覧

入れ子型辞書に変更する方法

s_akira

総合スコア15

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/10/29 06:22

編集2019/10/30 04:11

現状のdict形式をネストした状態と固定値を追加した状態に変更したいです。

下記の状態の辞書(dict)があります。
※Idやtextの、値が変動いたします。また、Idがない場合やtextがない場合があります。
{"Id": 4444, "text": "string"}

{ "Id": 4444, "text": "string" }

下記へ変更したいです。
{"variables": {"Id": {"value": "4444","type": "Integer"},"text": {"value": "string","type": "String"}}}
固定値:variables/value/type

{ "variables": { "Id": { "value": "4444", "type": "Integer" }, "text": { "value": "あああ", "type": "String" } } }

参考URL

Pythonでネストされたdictをどのように作成しますか?
ネストした辞書の初期化・更新・一覧・JSON保存をまとめておく/Python3(備忘)

isdigit()で落ちるコード

Python

1data = {} 2# {'Id': {'value': '4444', 'type': 'Integer'}}の形を作る 3for k,v in camel_data.items(): 4 data[k] = {} 5 data[k]['value'] = v 6 # 数値化文字列かの判定 7 if v.isdigit(): 8 data[k]['type'] = 'Integer' 9 else: 10 data[k]['type'] = 'String' 11 # variablesで囲む 12 v = {} 13 v['variables'] = {} 14 v['variables'] = data

備考

{'Id': {'value': '4444', 'type': 'Integer'}}を直接作成する方法・・・

Python

1d = {} 2d['Id'] = {} 3d['Id']['value'] = '4444' 4d['Id']['type'] = 'Integer' 5 6# 結果 7{'Id': {'value': '4444', 'type': 'Integer'}}

やり方がわからず混乱してしまっていて困っています。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/10/29 10:54

辞書のキーや値は固定ですか?
s_akira

2019/10/29 11:08 編集

ご質問ありがとうございます。 辞書の固定値は、variables、value、typeの3つが固定値となります。 それ以外は、全て変動の可能性がございます。IDの値が333や、IDを受け取らないでtextだけのパターンなどがございます。 (説明がわかりずらかったら申し訳ありません。)
guest

回答3

0

Python

1 2type_str = {int:'Integer',str:'String'} 3 4a = {'Id':4444,'text':'あああ'} 5 6x = {'variables':{}} 7 8if 'Id' in a: 9 x['variables']['Id'] = {'value':a['Id'],'type':type_str[type(a['Id'])]} 10if 'text' in a: 11 x['variables']['text'] = {'value':a['text'],'type':type_str[type(a['text'])]} 12 13print(x) 14#{'variables': {'Id': {'value': 4444, 'type': 'Integer'}, 'text': {'value': 'あああ', 'type': 'String'}}} 15

投稿2019/10/29 11:47

meg_

総合スコア10736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_akira

2019/10/30 04:43 編集

ご回答ありがとうございます。動作確認できました!ありがとうございます。 type_strの判定(?)の"type_str[type(a['Id'])]"の箇所がどうやって判定されているのか理解できないのですがどうなっているんでしょうか。よろしければ教えていただければ幸いです。。
meg_

2019/10/30 03:40

1.a['Id']で「4444」が取得できます。 2.type(4444)で「int」が取得できます。 3.type_str(int)で「'Integer'」が取得できます。
s_akira

2019/10/30 04:50

わかりやすいご説明ありがとうございます! 理解できました!
guest

0

ベストアンサー

こんな感じでできますが、読めますか。

Python

1import pprint 2 3# 4src = { 5 "Id": 4444, 6 "text": "string" 7} 8 9# 10def type_str(obj): 11 type_dct = { 12 int: 'Integer', str: 'String', 13 } 14 return type_dct.get(type(obj), 'Unknown') 15 16dst_i = {} 17for k, v in src.items(): 18 dst_i[k] = { 19 'value': str(v), 'type': type_str(v) 20 } 21 22dst = {'variables': dst_i} 23pprint.pprint(dst) # ただのprint関数を使っても良い

実行結果 Wandbox

{'variables': {'Id': {'type': 'Integer', 'value': '4444'}, 'text': {'type': 'String', 'value': 'string'}}}

追記:質問編集を受けて

isdigit()で落ちる

isdigitは、文字列が数字のみで構成されているか判定するメソッドです。
オブジェクトが数値型であるか判定する目的には使えません。

Python

1>>> '123'.isdigit() 2True 3>>> 123 .isdigit() 4Traceback (most recent call last): 5 File "<stdin>", line 1, in <module> 6AttributeError: 'int' object has no attribute 'isdigit'

蛇足
123 .isdigit() と間にスペースを置いているのは、
123.isdigit() だと小数リテラルと混同された結果シンタックスエラーを吐くからです。

投稿2019/10/29 11:33

編集2019/10/30 05:43
LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_akira

2019/10/30 04:53

ご回答ありがとうございます。動作確認できました! str(v)の箇所なのですが何か意味があると思いますが理解できませんでした。文字列にするため(?)でしょうか…意味を教えていただくこと可能でしょうか。 申し訳ありません。よろしければ教えていただければ幸いです。
LouiS0616

2019/10/30 05:24

4444 ではなく '4444' にしたいように見えたので。
s_akira

2019/10/30 07:36 編集

変な質問を申し訳ありません。。 理解できました!教えてくださり、ありがとうございます!
s_akira

2019/10/30 07:41

isdigit()の説明を追記くださり、ありがとうございます! 理解することができました。 わかりやすいご回答ありがとうございます。
guest

0

短くしてみました。
x.py

python3

1import json 2 3def type_str(v): 4 return {int: "Integer", str: "String"}.get(type(v), 'Unknown') 5 6data = { 7 "Id": 4444, 8 "text": "string" 9} 10 11z = {"variables": 12 {k: {"type" : type_str(v), "value": v} for k, v in data.items()} 13} 14print(json.dumps(z, sort_keys=True, indent=2)) 15 16 17

実行例
イメージ説明

投稿2019/10/30 23:39

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_akira

2019/10/31 04:34 編集

ご回答ありがとうございます!動作確認できました! 参考になります。変更加えて再度動かしてみようかと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問