来自json数据的python模型(attrs、dataclasses或custom)生成器,支持输入模块
json2python-models的Python项目详细描述
功能
- 测试示例
示例
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)< < > ><详细内容>
安装
<表><广告>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转换- 默认值:启用
--字符串转换器
-启用字符串类型转换器的生成(即isodatetimestring
或booleanstring
)< /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格式传递:true
或false
- 格式:
--代码生成器kwargs[name=value[name=value…]]
- 示例:
--代码生成器kwargs kwarg1=true kwarg2=10"kwarg3=it is string with spaces"
- 可选
- 格式:
需要一个模型参数(-m
或-l
)。
低水平API
< Buff行情>即将推出(wiki)
测试
要运行测试,您应该克隆project并运行setup.py
script:
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
使用
构建
贡献