ソースコードJSONシリアライズ・サポート・日時を変更します。

ソースコードJSONシリアライズ・サポート・日時を変更します。

import json
import datetime

now = datetime.datetime.today()

json.dumps(now)

例外を投げます

TypeError: Object of type 'datetime' is not JSON serializable

ビューは、ソース発見されたCLSのメソッド演技法をダンプ

    if cls is None:
        cls = JSONEncoder
    return cls(
        skipkeys=skipkeys, ensure_ascii=ensure_ascii,
        check_circular=check_circular, allow_nan=allow_nan, indent=indent,
        separators=separators, default=default, sort_keys=sort_keys,
        **kw).encode(obj)

最後に、我々は異常日時スロープロセスを傍受することができ、JSONEncoderでスローされた場所を見つけます

 可以看到json支持这些数据类型,要是不是这些类型的会进入defualt方法
 +-------------------+---------------+
    | Python            | JSON          |
    +===================+===============+
    | dict              | object        |
    +-------------------+---------------+
    | list, tuple       | array         |
    +-------------------+---------------+
    | str               | string        |
    +-------------------+---------------+
    | int, float        | number        |
    +-------------------+---------------+
    | True              | true          |
    +-------------------+---------------+
    | False             | false         |
    +-------------------+---------------+
    | None              | null          |
    +-------------------+---------------+

おそらくデフォルトのメソッドを書き換える方法を書き換えるの形を可能にするソースコードをコメントで知って、カスタマイズ

    def default(self, o):
        """Implement this method in a subclass such that it returns
        a serializable object for ``o``, or calls the base implementation
        (to raise a ``TypeError``).

        For example, to support arbitrary iterators, you could
        implement default like this::

            def default(self, o):
                try:
                    iterable = iter(o)
                except TypeError:
                    pass
                else:
                    return list(iterable)
                # Let the base class default method raise the TypeError
                return JSONEncoder.default(self, o)

        """
        raise TypeError("Object of type '%s' is not JSON serializable" %
                        o.__class__.__name__)

書き換え動作

import json
import datetime

class zxJsonClass(json.JSONEncoder):
    def default(self, o):
        if isinstance(o,datetime.datetime):#如果是datetime类型,转成json可以支持的类型
            return o.strftime('%Y-%m-%d')
        else:
            super().default(self,o)

now = datetime.datetime.today()
print(json.dumps(now, cls=zxJsonClass))

書き換え成功

import json
import datetime

class zxJsonClass(json.JSONEncoder):
    def default(self, o):
        if isinstance(o,datetime.datetime):#如果是datetime类型,转成json可以支持的类型
            return o.strftime('%Y-%m-%d')
        else:
            super().default(self,o)

now = datetime.datetime.today()
print(json.dumps(now, cls=zxJsonClass))

"2019-10-23"

リトル知識

import json

zx="圣诞树zx"
zx2 = {"h":"l"}
print(zx)
print(zx2)
print(json.dumps(zx,ensure_ascii=False))
print(json.dumps(zx2,ensure_ascii=False))

、辞書単一、二重引用符を二重引用符をもたらすでしょう、JSON文字列を出力しますが、通常の文字列が表示されません

JSON、このような変更は、より優れた文字列形式のJSONを区別するためにあります

おすすめ

転載: www.cnblogs.com/zx125/p/11728366.html