前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go 实现json 生成idl

go 实现json 生成idl

作者头像
golangLeetcode
发布2022-08-02 18:59:27
1.5K0
发布2022-08-02 18:59:27
举报
文章被收录于专栏:golang算法架构leetcode技术php

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

使用方式

代码语言:javascript
复制
./jsonToIdl toIdl -j ../t.json -d .
或者
./jsonToIdl toIdl -j ../t.json

比如我们的json数据t.json

代码语言:javascript
复制
[{
  "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"}]
}]

使用我工具生成后的格式如下

代码语言:javascript
复制
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 
}

然后我们可以在微调后很方便地生成我们希望格式 的数据。

当然对于很相似的数据我们想得到并集、差集,小工具也可以支持

代码语言:javascript
复制
./jsonToIdl union -l ../t.json -r ../t.json

./jsonToIdl diff -l ../t.json -r ../t.json

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档