来自json数据的python模型(attrs、dataclasses或custom)生成器,支持输入模块

json2python-models的Python项目详细描述


json2python models

而" rel="nofollow">pypi version构建状态covercoverstatuscodacy badge

示例功能

  • 目录
  • 示例
  • 安装
  • 用法
  • 测试
    • 测试示例
  • 用构建
  • 贡献
  • 许可证
  • 示例

    F1赛季成绩

    显示(长代码)

    driver_standings.json
    [
        {
            "season": "2019",
            "round": "3",
            "DriverStandings": [
                {
                    "position": "1",
                    "positionText": "1",
                    "points": "68",
                    "wins": "2",
                    "Driver": {
                        "driverId": "hamilton",
                        "permanentNumber": "44",
                        "code": "HAM",
                        "url": "http://en.wikipedia.org/wiki/Lewis_Hamilton",
                        "givenName": "Lewis",
                        "familyName": "Hamilton",
                        "dateOfBirth": "1985-01-07",
                        "nationality": "British"
                    },
                    "Constructors": [
                        {
                            "constructorId": "mercedes",
                            "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One",
                            "name": "Mercedes",
                            "nationality": "German"
                        }
                    ]
                },
                ...
            ]
        }
    ]
    
    json2models -f attrs -l DriverStandings driver_standings.json
    
    importattrfromjson_to_models.dynamic_typingimportIntString,IsoDateStringfromtypingimportList@attr.sclassDriverStandings:@attr.sclassDriverStanding:@attr.sclassDriver:driver_id:str=attr.ib()permanent_number:IntString=attr.ib(converter=IntString)code:str=attr.ib()url:str=attr.ib()given_name:str=attr.ib()family_name:str=attr.ib()date_of_birth:IsoDateString=attr.ib(converter=IsoDateString)nationality:str=attr.ib()@attr.sclassConstructor:constructor_id:str=attr.ib()url:str=attr.ib()name:str=attr.ib()nationality:str=attr.ib()position:IntString=attr.ib(converter=IntString)position_text:IntString=attr.ib(converter=IntString)points:IntString=attr.ib(converter=IntString)wins:IntString=attr.ib(converter=IntString)driver:'Driver'=attr.ib()constructors:List['Constructor']=attr.ib()season:IntString=attr.ib(converter=IntString)round:IntString=attr.ib(converter=IntString)driver_standings:List['DriverStanding']=attr.ib()
    < < > ><详细内容>

    招摇

    显示(长代码)

    swagger.json来自任何在线api(我测试了drf yasg生成的文件和spotify api的另一个文件)

    它需要稍微调整一下:

    • 有些字段将路由/型号规格存储为dict
    • 有很多光学场,因此我们降低了合并阈值
    json_to_models -s flat -f dataclasses -m Swagger testing_tools/swagger.json 
        --dict-keys-fields securityDefinitions paths responses definitions properties 
        --merge percent_50 number
    
    fromdataclassesimportdataclass,fieldfromjson_to_models.dynamic_typingimportFloatStringfromtypingimportAny,Dict,List,Optional,Union@dataclassclassSwagger:swagger:FloatStringinfo:'Info'host:strschemes:List[str]base_path:strconsumes:List[str]produces:List[str]security_definitions:Dict[str,'Parameter_SecurityDefinition']security:List['Security']paths:Dict[str,'Path']definitions:Dict[str,'Definition_Schema']@dataclassclassInfo:title:strdescription:strversion:str@dataclassclassSecurity:api_key:Optional[List[Any]]=field(default_factory=list)basic:Optional[List[Any]]=field(default_factory=list)@dataclassclassPath:parameters:List['Parameter_SecurityDefinition']post:Optional['Delete_Get_Patch_Post_Put']=Noneget:Optional['Delete_Get_Patch_Post_Put']=Noneput:Optional['Delete_Get_Patch_Post_Put']=Nonepatch:Optional['Delete_Get_Patch_Post_Put']=Nonedelete:Optional['Delete_Get_Patch_Post_Put']=None@dataclassclassProperty:type:strformat:Optional[str]=Nonexnullable:Optional[bool]=Noneitems:Optional['Item_Schema']=None@dataclassclassProperty_2E:type:strtitle:Optional[str]=Noneread_only:Optional[bool]=Nonemax_length:Optional[int]=Nonemin_length:Optional[int]=Noneitems:Optional['Item']=Noneenum:Optional[List[str]]=field(default_factory=list)maximum:Optional[int]=Noneminimum:Optional[int]=Noneformat:Optional[str]=None@dataclassclassItem:ref:Optional[str]=Nonetitle:Optional[str]=Nonetype:Optional[str]=Nonemax_length:Optional[int]=Nonemin_length:Optional[int]=None@dataclassclassParameter_SecurityDefinition:name:strin_:strrequired:Optional[bool]=Noneschema:Optional['Item_Schema']=Nonetype:Optional[str]=Nonedescription:Optional[str]=None@dataclassclassDelete_Get_Patch_Post_Put:operation_id:strdescription:strparameters:List['Parameter_SecurityDefinition']responses:Dict[str,'Response']tags:List[str]@dataclassclassItem_Schema:ref:str@dataclassclassResponse:description:strschema:Optional[Union['Item_Schema','Definition_Schema']]=None@dataclassclassDefinition_Schema:ref:Optional[str]=Nonerequired:Optional[List[str]]=field(default_factory=list)type:Optional[str]=Noneproperties:Optional[Dict[str,Union['Property_2E','Property']]]=field(default_factory=dict)
    < < > ><详细内容>

    安装

    <表><广告>BE WARE:此项目仅支持python3.7及更高版本。

    要安装它,请使用pip

    pip安装json2python模型

    或者您可以从源代码构建它:

    git clone https://github.com/bogdandm/json2python-models.git
    cd json2python-models
    python setup.py install
    

    用法

    CLI

    对于常规使用来说,cli工具是最好的选择。安装此软件包后,可以将其用作json2models<;arguments>; 或者python-m json\u to\u models<;arguments>;。即:

    json2models -m Car car_*.json -f attrs > car.py
    

    参数:

    • -h--help-显示帮助消息并退出

    • -m--model-模型名及其json数据作为路径或类unix路径模式。***支持模式符号。

      • 格式-m<;模型名>;[<;json文件>;…]
      • 示例-m car audi.json reno.json-m car audi.json-m car reno.json(结果相同)
    • -l--list-类似于-m但是给定的json文件应该包含模型数据(dataset)的列表。 如果此文件包含带有嵌套列表的dict,则可以将<;json key>;传递给查找。 深度查找由点分隔路径支持。如果不需要查找,请将-作为<;json key>;

      • 格式-l<;型号名称>;<;json键>;<;json文件>;
      • 示例-l car-cars.json-l person fetch_results.items.persons result.json
      • 注意:此参数下的模型名称应该是唯一的。
    • -o--输出-输出文件

      • 格式-o<;文件>;
      • 示例-o car_model.py
    • -f--framework-生成python代码的模型框架。 base(默认值)表示没有框架,因此在没有任何修饰符和附加元数据的情况下将生成代码。

      • 格式-f{base、attrs、dataclasses、custom}
      • 示例-f属性
      • 默认值-f base
    • -s--结构-模型组合样式。

      • 格式-s{nested,flat}
      • 示例-s平面
      • 默认值-s嵌套
    • --date time-启用datetime/date/time字符串分析。

      • 默认值:禁用
      • 警告:这可能导致大型数据集的速度降低6-7倍。确保您确实需要此选项。
    • --禁用Unicode转换--无Unidecode-禁用字段标签和类名中的Unicode转换

      • 默认值:启用
    • --字符串转换器-启用字符串类型转换器的生成(即isodatetimestringbooleanstring)< /P>

      • 默认值:禁用
    • --合并-合并策略设置。可能的值为:

      • 格式--合并合并策略[合并策略…]
      • 可能值(合并策略):
        • percent[<;percent>;]-两个模型的字段名匹配率是一定的。 自定义值可以是percent\u 95
        • number[<;number>;]-两个型号具有一定数量的匹配字段名。
        • 精确-两个模型应具有完全相同的字段名以进行合并。
      • 示例--合并百分比95个数字20-如果95%的字段匹配或20个字段匹配,则合并
      • 默认值--合并百分比70数字10
    • --dict keys regex--dkr-正则表达式列表(python语法)。 如果某个dict的所有键都匹配其中一个模式,那么 此dict将标记为dict字段,但不是嵌套模型。

      • 格式--dkr regex[regex…]
      • 示例--dkr node\d+\d+\d+\d+
      • 注意^$(字符串边框)标记将自动添加,但您 必须手动转义其他特殊字符。
      • 可选
    • --dict keys字段--dkf-将标记为dict字段的模型字段名称列表

      • 格式--dkf字段名[字段名…]
      • 示例--dkf"dict_data""mapping"
      • 可选
    • --代码生成器-指向genericmodelcodegenerator子类的绝对导入路径。

      • 格式--代码生成器代码生成器
      • 示例-f mypackage.mymodule.djangomodelsgenerator
      • 注意:忽略而不使用-f custom,但它是必需的。
    • --代码生成器kwargs-genericmodelcodegenerator子类参数列表(对于\uu init\uu方法, 参见特定子类的文档)。 每个参数应采用以下格式:argument_name=value"argument_name=value with space"。 布尔值应以js格式传递:truefalse

      • 格式--代码生成器kwargs[name=value[name=value…]]
      • 示例--代码生成器kwargs kwarg1=true kwarg2=10"kwarg3=it is string with spaces"
      • 可选

    需要一个模型参数(-m-l)。

    低水平API

    < Buff行情>

    即将推出(wiki)

    测试

    要运行测试,您应该克隆project并运行setup.pyscript:

    git clone https://github.com/bogdandm/json2python-models.git
    cd json2python-models
    python setup.py test -a '<pytest additional arguments>'
    

    另外,我建议您安装pytest sugar以获得漂亮的打印测试结果

    测试示例

    您可以在testing\u tools/real\u api/…

    每个文件都包含从一些在线api(文件顶部包含的引用)下载数据的函数,并且 main生成和打印代码的函数。一些示例可能在实际代码之前打印调试数据。 下载的数据将保存在testing_tools/real_api/<;name of example>;/<;dataset>;.json

    使用

    构建

    测试工具:

    贡献

    可以使用新功能或错误修复打开拉取请求。只需遵循以下几条规则:

    1. 始终使用一些代码格式化程序(黑色或pycharm内置)
    2. 代码覆盖率保持在95-98%以上
    3. 所有现有的测试都应该通过(包括testing_tools/real_api中的测试示例)
    4. 使用键入模块
    5. 修复pr中的codacy问题 < > >

      许可证

      此项目是在麻省理工学院许可证下授权的-有关详细信息,请参见许可证文件

      欢迎加入QQ群-->: 979659372 Python中文网_新手群

      推荐PyPI第三方库


    热门话题
    java如何运行一个在播放歌曲的同时创建和更改UI的方法?   eclipse错误:无法找到或加载主类Java,因为类文件anme和类名不同?   两个数字相加得到一个值的java算法   java我可以更改字符串吗?   java Hibernate 5.2:以编程方式从其他jar加载映射   java如何访问随机跳转到固定位置的二进制文件   java是解析器实现中文档的功能   Javasocket的两端齐平   java查找将两个非常大的整数之和除以相等块的步骤   java如何在Restlet中调用带超时的异步HTTP客户端   java如何从servlet请求将hashmap传递给jsp。塞塔提布特   java Spring MVC HTTP状态500–内部服务器错误,Servlet。servlet[dispatcher]的init()引发异常   java即使没有alpha通道,如何将PNGFiles加载为ARGB_8888?   java将subscribe的返回类型映射到其他类型   javascript如何在安卓 WebView中启用longpress操作下载图像?   java将字符串作为hashmap值的一部分添加到StringList中   JavaSpringAOP:代表类型声明其他方法或字段   Java将二进制序列转换为字符   java使用ApachePOI获取最后一行值   为什么要在FPS(每秒帧数)跟踪器中添加时间?(爪哇)