質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
JSON

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6459閲覧

JSONシリアライズでDecimal を扱う方法について

pokemonta

総合スコア170

JSON

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/15 13:56

編集2020/10/15 14:11

作りたいJSONデータに対して、以下のpythonプログラムを
作成しましたが"errorMessage":"Object of type Decimal is not JSON serializable"が
発生して解決できません。解消方法をご教示頂けないでしょうか
それと作りたいJSONデータに整形の仕方がわかりません。
result に対してさらにforループを追加しないといけないのでしょうか?
また、よくわからない点としまして、最終的にitemsは、配列2つできることを
期待しているのですが、
'dataList, 'country', 'timestamp' それぞれにappendすると
6個の配列にならないでしょうか?

python

1 result = get_item(data) 2 if result is not None: 3 Item.append(result) 4 5 return { 6 "body": json.dumps(Item)

Itemの中身

[{'dataList': {'Name': 'yamada', 'age': Decimal('21')}, 'country': 'japan', 'timestamp': '2020-04-01T11:10:00.000Z'}, {'dataList': {'Name': 'tanaka', 'age': Decimal('33')}, 'country': 'america', 'timestamp': '2020-04-01T11:10:00.000Z'}]

作りたいJSONデータ

"timestamp": 2020-04-01T11:10:00.000Z,     "items": [ {     "Name": 'yamada',     "age": 21,     "country": 'japan' }, {     "Name": 'tanaka',     "age": 33,     "country": 'america' }

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

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

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

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

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

guest

回答2

0

ベストアンサー

Pythonのjson.dumps/json.dumpには「オブジェクトがこの型だったらこう変換する」というEncoderがあるので、
一応、Decimalに対する変換を自前実装すれば出来なくはないです。

python import json from decimal import Decimal class DecimalEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Decimal): return int(obj) return json.JSONEncoder.default(self, obj) data = [{'dataList': {'Name': 'yamada', 'age': Decimal('21')}, 'country': 'japan', 'timestamp': '2020-04-01T11:10:00.000Z'}, {'dataList': {'Name': 'tanaka', 'age': Decimal('33')}, 'country': 'america', 'timestamp': '2020-04-01T11:10:00.000Z'}] print(json.dumps(data, cls=DecimalEncoder))

ただ、

  • これだと、今度json.loadを実行してもDecimalにはならない
  • ageに整数以外を期待するのでないのであれば、最初からintのほうが良い

とは思いますが。

投稿2020/10/15 14:15

attakei

総合スコア2738

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

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

pokemonta

2020/10/15 14:18

勉強なりました。ありがとうございました。
guest

0

文字列に変換するしか無いと思います。

投稿2020/10/15 14:08

otn

総合スコア84708

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

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

pokemonta

2020/10/15 14:12

json.dumpsに格納できないということでしょうか?
otn

2020/10/15 14:30

私の想定は、json.dumpsの前にあらかじめ変換しておく方法ですが、attakeiさんの回答のように異聞で恵コーダーを書く方法もありますね。 同じく指摘があるように、年齢であれば文字列でなく整数でも良いですね。 なぜDecimal型なのでしょうか?
pokemonta

2020/10/15 14:42

DBがそのようになっています。 一つ目の配列から"Name"、"age"(intかStringに変換したとして)、"country"の値を取得できたとして このままappendすると[yamada,21,japan]となるだけで map型にはなりませんよね?("Name": 'yamada',"age": 21,"country": 'japan') map型に変換してそれをappendすることになるのでしょうか? d = {'Name': yamada, 'age': 21, 'country': japan} append(d)
otn

2020/10/15 14:51 編集

> DBがそのようになっています。 DBの数値項目を読むとDecimal型にしてしまうライブラリを使っているということでしょうかね。 > map型に変換してそれをappendすることになるのでしょうか? そうですね。 欲しい構造を作るコードを書きます。
pokemonta

2020/10/16 00:07

>DBの数値項目を読むとDecimal型にしてしまうライブラリを使っているということでしょうかね。 そうです。awsのdynamodbでnumber型を定義するとデシマルで値が返ってきます。 >そうですね。 >欲しい構造を作るコードを書きます。 getItemした結果をこれまでappendしかしたことがなく 作りたいデータ形式に変換したことがありません。(とりあえずjson.dumpみたいな感じでした) これをmapしてからっていうのがなかったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問