[python][scrapy] 型 'bytes' のオブジェクトは JSON シリアライズ可能ではない
2022-02-13 18:23:03
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#json_extention
#2014-03-16
#copyright: orangleliu
#license: BSD
'''''
The dumps method in python is very useful, it can directly serialize our dict into json objects.
But sometimes we can't serialize it if we add some custom classes, so we need to
custom serialization methods
Reference:
http://docs.python.org/2.7/library/json.html
For example:
In [3]: from datetime import datetime
In [4]: json_1 = {'num':1112, 'date':datetime.now()}
In [5]: import json
In [6]: json.dumps(json_1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
D:\devsofts\python2.7\lib\site-packages\django\core\management\commands\shell.py
c in <module>()
----> 1 json.dumps(json_1)
TypeError: datetime.datetime(2014, 3, 16, 13, 47, 37, 353000) is not JSON serial
izable
'''
from datetime import datetime
import json
class DateEncoder(json.JSONEncoder ):
def default(self, obj):
if isinstance(obj, datetime):
return obj.__str__()
return json.JSONEncoder.default(self, obj)
json_1 = {'num':1112, 'date':datetime.now()}
print(json.dumps(json_1, cls=DateEncoder))
'''''
Output result.
PS D:\code\python\python_abc> python . \json_extention.py
{"date": "2014-03-16 13:56:39.003000", "num": 1112}
'''
# Let's try a custom class
class User(object):
def __init__(self, name):
self.name = name
class UserEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, User):
return obj.name
return json.JSONEncoder.default(self, obj)
json_2 = {'user':User('orangle')}
print(json.dumps(json_2, cls=UserEncoder))
--------------------------------------------------------------------
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bytes):
return str(obj, encoding='utf-8')
return json.JSONEncoder.default(self, obj)
jsontext = json.dumps(dict(item),ensure_ascii=False,cls=MyEncoder)+'\n'
--------------------------------------------------------------------
'''''
PS D:\code\python\python_abc> python . \json_extention.py
{"date": "2014-03-16 14:01:46.738000", "num": 1112}
{"user": "orangle"}
'''
--------------------------------------------------------------------
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bytes):
return str(obj, encoding='utf-8')
return json.JSONEncoder.default(self, obj)
jsontext = json.dumps(dict(item),ensure_ascii=False,cls=MyEncoder)+'\n'
--------------------------------------------------------------------
'''''
PS D:\code\python\python_abc> python . \json_extention.py
{"date": "2014-03-16 14:01:46.738000", "num": 1112}
{"user": "orangle"}
'''
定義ハンドラは、json.JSONEncoderを継承するサブクラスで、dumpsメソッドのcls関数にカスタムハンドラを追加して使用します。
関連
-
[解決済み] ValueError : 閉じたファイルへのI/O操作
-
VSで「この関数または変数は安全でない可能性があります」エラーの解決法
-
[解決済み] git リポジトリの .pyc ファイルを無視する。
-
[解決済み] python-dev のインストールエラーです。ImportError: apt_pkg という名前のモジュールがありません。
-
[解決済み] _csv.Error: iterator should return strings, not bytes (did you open file in text mode?) [duplicate].
-
[解決済み] PyCharmの未解決の参照の問題
-
[解決済み] pyQtのUIをpythonに変換する
-
IndexError: Index 0 is out of bounds for axis 0 with size 0
-
import xlrd を実行すると、ModuleNotFoundError というエラーが発生します。xlrd'という名前のモジュールはありません。
-
python merge matrix error 入力配列はすべて同じでなければならない......そしてvstack()は1つの位置の配列を受け取る......etc......。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】np.unravel_indexの直感的な説明とは?
-
python TypeError: Unicode オブジェクトはハッシュ化する前にエンコードする必要がある 解決策
-
[解決済み] IDLEでcalltipsを表示するには?
-
[解決済み] Python の curve_fit を複数の独立変数に対応させる
-
[解決済み] Pythonのプロットでギリシャ文字などを入力する
-
[解決済み] バインドパラメーター 0 のエラー: おそらくサポートされていないタイプです。
-
python installation module shows *.whl is not a supported wheel on this platform.
-
Python3dの描画 mpl_toolkits.mplot3d
-
TypeError: 'list' オブジェクトは整数値として解釈できません。