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:12345678901
4: double d //eg:1.2345678
5: double f //eg:1e-123
6: i32 g //eg:112
7: i32 h //eg:0
8: NonCamelStyle non_camel_Style //eg:null
9: string non_camel_Style_string //eg:"non_camel_Style_string"
}
struct GeneratedStruct {
1: string description //eg:"An imaginary server config file"
2: Logs logs
3: string host //eg:"antlr.org"
4: list<string> admin
5: list<Aliases> aliases
6: Spaces Spaces
7: list<i32> keys
8: Null null_ //eg:null
9: bool bool_ //eg:true
10: list<Structs> structs
}
struct GeneratedArr {
1: list<GeneratedStruct> generatedStruct
}
然后我们可以在微调后很方便地生成我们希望格式 的数据。
当然对于很相似的数据我们想得到并集、差集,小工具也可以支持
./jsonToIdl union -l ../t.json -r ../t.json
./jsonToIdl diff -l ../t.json -r ../t.json
本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!