json 是一种很方便直观的数据格式,非常方便业务开发,特别是若类型语言,比如php。
但是对于数据密集型应用,数据治理是一个很头疼的问题,通过idl生成dto是一种很常见的方式。
如何获得idl呢?
第一种方式是手工获取,通过对json数据的理解,手动编写对应的idl,有两个问题:
1,工作量大,很容由于拼写、大小写问题导致字段错误、重复、缺失,修改测试工作量大
2,风格难统一,不同人的思路、代码风格都不一致,很多人不愿意写注释,后期维护难度大
第二总方式就是自动生成。
我们知道,通过idl我们可以方便生成目标代码和文档,非常方便数据管理,但是通过数据生成idl 是一个比较难的问题,因为数据丢失了schema信息,要想恢复schema必须加上很多自定义策略,通过json生成idl也是如此。
1,比如idl中数字有 i32,i64,float,double 等类型,在json中只有float64类型
2,比如对json中的null,原来的数据类型很难确定。
我们定义如下策略:
1,针对浮点格式数据,统一生成double类型
2,针对整数类型,如果长度小于10,统一生成i32,否则i64
3,null类型统一生成空结构体,用户按需调整
4,json数据统一生成注释,格式:// eg: xxx
定义好上述策略以后,我们可以根据线上日志,得到json格式的业务数据
然后用我们的工具生成idl,工具地址
https://github.com/xiazemin/jsonToAll
使用方式
./jsonToIdl toIdl -j ../t.json -d .或者./jsonToIdl toIdl -j ../t.json
比如我们的json数据t.json
[{ "description" : "An imaginary server config file", "logs" : {"level":"verbose", "dir":"/var/log"}, "host" : "antlr.org", "admin": ["parrt", "tombu"], "aliases": [ ], "Spaces": { }, "keys":[1,2,3,4], "null_": null, "bool_": true, "structs":[{"a":"a","b":"2","c": 12345678901, "d": 1.2345678, "f": 1e-123, "g": 112, "h": 0, "non_camel_Style": null, "non_camel_Style_string": "non_camel_Style_string"}]}]
使用我工具生成后的格式如下
namespace php json.to.idl struct Logs {1: string level //eg:"verbose"2: string dir //eg:"/var/log"}struct Aliases{}struct Spaces {}struct Null{}struct NonCamelStyle{}struct Structs{1: string a //eg:"a"2: string b //eg:"2"3: i64 c //eg:123456789014: double d //eg:1.23456785: double f //eg:1e-1236: i32 g //eg:1127: i32 h //eg:08: NonCamelStyle non_camel_Style //eg:null9: string non_camel_Style_string //eg:"non_camel_Style_string"}struct GeneratedStruct {1: string description //eg:"An imaginary server config file"2: Logs logs3: string host //eg:"antlr.org"4: list<string> admin5: list aliases6: Spaces Spaces7: list keys8: Null null_ //eg:null9: bool bool_ //eg:true10: list structs}struct GeneratedArr { 1: list generatedStruct }
然后我们可以在微调后很方便地生成我们希望格式 的数据。
当然对于很相似的数据我们想得到并集、差集,小工具也可以支持
./jsonToIdl union -l ../t.json -r ../t.json
./jsonToIdl diff -l ../t.json -r ../t.json