Bridge(对象转JSON)

概述

Bridge类

Bridge类是框架自带的ABC,用于框架在输入输出时进行类型转换。

如要要自己实现Bridge的子类,需要实现__init__to两个方法,必须标注__init__()的参数类型和to()的返回类型(且类型不能是TypeVar)。在递归转换类型时,可以使用Bridge类自带的cast()方法。

调用app.add_bridge()方法使Bridge子类生效。在每次类型转换时,会触发第一个符合类型从属关系的bridge。

Jsonizable类型

框架自带的Jsonizable的定义为

Jsonizable = Union[str, int, float, Dict, List, None]

注意int是Jsonizable,但Jsonizable不是int,其他类型同理。Union[...]中不包含bool是因为bool是int的子类。

示例

class Pair:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class PairPlus:
    x: int = 0
    y: Pair
    _z: int = -1

    @staticmethod
    def of(pair)->'PairPlus':
        ret = PairPlus()
        ret.y = pair
        return ret

class PairToJson(Bridge):
    def __init__(self, source: Pair):
        self.source = source

    def to(self) -> Jsonizable:
        return [
            self.source.x,
            self.cast(self.source.y, complex, str)
        ]

class ComplexToJson(Bridge):
    def __init__(self, source: complex):
        self.source = source

    def to(self) -> str:
        return str(self.source)

app = Application()
app.add_bridge(PairToJson)
app.add_bridge(ComplexToJson)
app.add_get_mapping('/pair', dealer=lambda: PairPlus.of(Pair(3, 3+2j)))
app.run()

请求: curl "http://localhost:8080/pair"
返回: {"x": 0, "y": [3, "(3+2j)"]}