#generate-json #json #generator #libraries #json-generator #json-template

bin+lib json-generator-rand

用于生成 JSON 项的简单控制台工具和库

1 个不稳定版本

0.2.0 2021 年 5 月 24 日

#6#libraries

自定义许可证

80KB
1.5K SLoC

Json 生成器

根据提供的示例组成 JSON 主体和定义生成新项逻辑的一组函数的简单控制台工具。

该工具允许将生成的 JSON 传输到不同的来源,如 HTTP 服务器、文件夹、文件或控制台

总体而言

给定模板

{
  "description": "the example how to create a json template to generate new jsons",
  "note": "the prefix | in a field name signals that the field carries a function to generate data.",
  "record": {
    "|type": "str_from_list(business,technical,analytical)", 
    "technical":{
       "|id": "uuid()",
       "|index": "seq()",
       "|updated_tm": "dt()",
       "|created_tm": "dt(%Y-%m-%d %H:%M:%S)"
     },
    "|is_active": "bool()",
    "|name": "str(10,customer)",
    "|email": "str(5,,@gmail.com)",
    "|code": "str(5,,'(code)')",
    "|dsc": "str(20)",
    "geo": {
        "|country": "str_from_file(jsons/countries,,)",
        "|city": "str_from_file(jsons/cities,'\n')",
        "|street": "str(10,,-street)",
        "|house": "int(1,1000)"
      },
    "|id_parent": "int_from_list(1,2,3,4,5,6,7)",
    "|related_records": "int(1,1000) -> array(5)"

  }
}

生成的 json

{
  "description": "the example how to create a json template to generate new jsons",
  "note": "the prefix | in a field name signals that the field carries a function to generate data.",
  "record": {
    "code": "Upaz2(code)",
    "dsc": "gLgvDinPZg1aMu9LpPyp",
    "email": "[email protected]",
    "geo": {
      "city": "Rome",
      "country": "Australia",
      "house": 770,
      "street": "7Ke4CAHWpk-street"
    },
    "id_parent": 7,
    "is_active": false,
    "name": "customerXgKChm5t2b",
    "related_records": [
      263,
      489,
      390,
      226,
      361
    ],
    "technical": {
      "created_tm": "2021-05-23 13:09:27",
      "id": "339b0ca7-0e00-4d6e-8073-d270d7d56e2e",
      "index": 1,
      "updated_tm": "2021-05-23 13:09:27"
    },
    "type": "analytical"
  }
}

生成的规则

总体而言,如果字段没有特定的前缀,表示该字段包含生成器函数,则取该字段的值并将其作为结果返回。否则,如果字段名称中包含前缀,则期望值是一个字符串,描述生成值的函数。默认前缀是 |,如示例所示

{
  "|dynamic_field_with_generator": "seq()",
  "static_field": "constant"
}

*注意:如果前缀符号与现有字段冲突,则可以将其更改为任何其他字符。

生成器

每个生成器都有以下语法: generator name ( arg1, arg2, ..)

如果生成器包含另一个生成器,则语法将获得额外的元素: internal generator (arg1, arg2, .. ) -> encompassing generator (arg1, arg2, ..)

生成器可以有空的参数: str(10,,postfix)

字符串字面量可以直接放置为参数,也可以用单引号括起来: str(10,literal,'with quotes')

生成器列表

生成器 参数=默认值 描述 示例
seq 起始点=0,步长=1 顺序增加的数字行(1,2,3,4 ...) seq() / seq(10,2) / seq(,2)
bool 生成的布尔值 bool()
str 行大小=0,前缀='',后缀='' 由随机字母和数字组成的行,具有前缀和后缀的预定义长度 str() / str(10) / str(,prefix,) / str(,,'suffix') / str(10,abc,cde)
int 下限=0,上限=1000 位于预定义范围内的随机数 int() / int(1,100) / int(1) / int(,10)
str_from_list 值列表 字符串列表 str_from_list(a,'b',c,d)
int_from_list 值列表 数字列表 int_from_list(1,2,3,4,5)
str_from_file 文件路径,分隔符=',' 从预定义文件中提取的字符串列表:注意,分隔符可以省略,默认分隔符(,)将被使用 str_from_file(\home\user\json) str_from_file(\home\user\json,;) str_from_file(\home\user\json,\n)
int_from_file 文件路径,分隔符=',' 从预定义文件中提取的数字列表:注意,分隔符可以省略,默认分隔符(,)将被使用 int_from_file(c:\user\json)
uuid 生成的uuid uuid()
dt 格式=%Y-%m-%d %H:%M:%S 当前日期和时间。 dt(%Y-%m-%d)/dt()
array func_to_generate -> array(number=1) 用于获取填充数组的生成器。 int(1) -> array()

如何使用

从控制台

命令行示例

json-generator  -f "file path" -r 10 --pretty --logs --to-folder folder --to-curl '-X POST ip'
命令行参数
描述 示例
b body 文本表示json模板 --body | -b '{"k":"v"}'
f file 包含json模板的文件路径 --file | -f c:\folder\json.json
r repeat 重复次数 --repeat | -r 10
i indicator 指示字段包含生成函数的指示器。 --indicator | -i >
pretty 插入格式化符号以使json可读 --pretty
logs 打印日志 --logs
to-console 在控制台显示json(默认情况下,如果输出数组为空) --to-console
to-file 将生成的json追加到文件中。如果文件不存在,则创建一个新的文件。文件夹应该存在。 --to-file c:\folder\jsons.json
to-folder 在所选文件夹中创建新文件。如果不存在,则创建文件夹。 --to-file c:\folder
to-curl 使用curl将json发送到服务器。实际上,将添加-d。 --to-curl "-H Content-Type:application/json -X POST 127.0.0.1:7878"
h help 有关命令的信息 -h | --help
V version version -V | --version

注意:使用--to-curl参数的系统需要安装curl实用程序。

从依赖项

json-generator="0.2.0"
use json_generator::json_template::JsonTemplate;
use json_generator::generate;
use serde_json::Value;

fn main() {
    let json_template:&str = "{\"|id\":\"seq()\"}";
    let mut json_template = JsonTemplate::from_str(json_template, "|").unwrap();
    let generated_value:Vec<Value> = generate(&mut json_template,10,true,&mut vec![]);
}

发送者

函数generate获取最后一个参数,它是一个发送者数组。本质上,发送者是实现sender trait的结构体。

pub trait Sender {
    fn send(&mut self, json: &Value, pretty: bool) -> Result<String, GenError>;
}

简单实现示例

 use json_generator::sender::{Sender, ConsoleSender, string_from};
 use serde_json::Value;
 
impl Sender for ConsoleSender {
fn send(&mut self, json: &Value, pretty: bool) -> Result<String, GenError> {
    println!("{}",  string_from(json, pretty)?);
    Ok("the item has been sent to the console".to_string())
   }
 }

GenError

默认情况下,所有内容都包裹在Gen(erator)Error中,这是处理错误的一般结构。

通常,它具有以下内容

#[derive(Debug)]
pub struct GenError {
    reason: String,
    tpe: GenErrorType,
}

#[derive(Debug)]
pub enum GenErrorType {
    Parser,
    Sender,
    Generator,
    Common,
}

并提供以下方法来操作

impl GenError {
    pub fn new_with(reason: &str) -> Self {..}
    pub fn new_with_in_parser(reason: &str) -> Self {..}
    pub fn new_with_in_sender(reason: &str) -> Self {..}
    pub fn new_with_in_generator(reason: &str) -> Self {..}
}

依赖关系

~13–22MB
~336K SLoC