9 个版本
0.1.8 | 2023 年 5 月 25 日 |
---|---|
0.1.7 | 2023 年 5 月 19 日 |
#47 在 电子邮件
每月 95 次下载
46KB
899 行
Mock JSON
一个非常简单且易于使用的 JSON 生成工具,支持自定义格式,并可使用自定义 占位符
扩展。
示例
use mock_json::mock;
use serde_json::json;
let val = mock(&json!({
"code":0,
"msg":"just text",
"data":[{
"id":"@Id|10",
"title": "@Title",
"datetime":"@DateTime",
"author":{
"name":"@Name",
"id":"@Guid",
"email":"@Email",
"id_number":"@IdNumber",
"ip":"@Ip",
"phones":["@Phone", 1, 3],
"blog":"@Url",
"avatar":"@Image|80X80|f7f7f7|fff"
}
}, 5, 20]
}));
上面的代码将返回一个 serde_json::Value
,在调用 val.to_string()
后,其内容如下
{
"code": 0,
"msg": "just text",
"data": [
{
"author": {
"avatar": "https://dummyimage.com/80X80/f7f7f7/fff",
"blog": "https://fvopl.ktuh.int/dcvr",
"email": "[email protected]",
"id": "ceE68058-5EaB-4bc2-cCc8-F4a2Dff1Fe6A",
"id_number": "646734191701136174",
"ip": "132.86.194.66",
"name": "Patricia Garcia",
"phones": [
"13318945147",
"14923999763"
]
},
"datetime": "1960-02-12 03:49:48",
"id": "3217A3bAAa",
"title": "bymebox wpvvpv udp pcb lky onigkew sywtnhq"
},
...
]
}
生成数据列表
要生成数据列表,可以使用格式 [serde_json::Value, min, max]
,生成大于 min
且小于 max
的数据数量。
let val = mock(&json!([{"user_name": "@Name", "email": "@Email", "age":"@Number|18~100"}, 2, 5]));
然后调用 val.to_string()
,其内容如下
[
{
"age": 43,
"email": "[email protected]",
"user_name":"Laura White"
},
{
"age": 35,
"email": "[email protected]",
"user_name":"Frank Hernandez"
},
{
"age": 31,
"email": "[email protected]",
"user_name":"Jose Wilson"
}
]
实现
原理是将 占位符
替换为相应的内容。每个 占位符
以 @
开头,后跟一个 占位符名称
,以及可选的用 |
分隔的参数。例如,@Id
将生成一个包含 [a-zA-Z0-9]
的 12 位字符串。如果您想生成一个长度为 5 的 ID,只需使用 @Id|5
。每个 占位符
的返回值是 serde_json::Value
。
占位符
默认提供的 占位符
如下
@Guid
随机生成格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 的字符串,无任何参数。
mock(&json!("@Guid")); // String("753c33fE-fFdB-12aF-bC44-A9DD2D7E10aA")
@Id
随机生成一个包含 [a-zA-Z0-9]
的 12 位字符串。如果您想生成一个自定义长度的 ID,例如使用 @Id|5
。
// Default length: 12
mock($json!("@Id")); // String("YNyxSBVzgpQd")
// Custom length
mock(&json!("@Id|5")); // String("vygCt")
@IdNumber
随机生成一个中国身份证号码,不接受参数。
mock(&json!("@IdNumber")); // String("665471198804049116")
@Phone
随机生成一个中国手机号码,不接受参数。
mock(&json!("@Phone")); // String("13983370699")
mock(&json!("@Phone|86")); // String("+86 13545607699")
@Bool
随机生成一个布尔值,不接受参数。
mock(&json!("@Bool")); // Bool(true)
@Name
随机生成一个英文名。它可以接受参数。如果您想生成一个中文名,可以传递参数 cn
。
mock(&json!("@Name")); // String("Donald Davis")
// Generate a Chinese name
mock(&jsonQ("@Name|cn")); // String("蔡茗泽")
@FirstName
随机生成一个 first name
。它可以接受参数。如果您想生成一个中文名,可以传递参数 cn
。
mock(&json!("@FirstName")); // String("Mark")
// Generate a Chinese surname
mock(&json!("@FirstName|cn")); // String("张")
@LastName
随机生成一个 last name
。它可以接受参数。如果您想生成一个中文名,可以传递参数 cn
。
mock(&json!("@LastName")); // String("Martin")
// Generate a Chinese last name
mock(&json!("@LastName|cn")); // String("沐宸")
@Url
随机生成一个URL。URL的协议可以自定义。
mock(&json!("@Url")); // String("https://mqezx.rpmy.int/gevc")
// Customize the URL protocol
mock(&json!("@Url|ftp")); // String("ftp://qjwb.wpukq.gov/tmkwq")
@Token
随机生成一个令牌。
mock(&json!("@Token")); // String("htK5pesIqPTJYK8Yn286.RG0mgC0vHPlQU7SnxWx3.fHsemPcj43bEY0hJSSfJ")
随机生成一个电子邮件地址,不接受参数。
mock(&json!("@Email")); // String("[email protected]")
@Ip
随机生成一个IP地址。默认情况下,IP格式为IPv4,但也支持通过传递 ipV6
生成IPv6地址。
// ipv4
mock(&json!("@Ip")); // String("161.26.255.122")
// ipv6
mock(&json!("@Ip|ipV6")); // String("D991:53F9:2131:D6CA:86DA:56C4:156D:91B0")
@Domain
随机生成一个域名,不接受参数。
mock(&json!("@Domain")); // String("hxca.gov")
@Paragraph
随机生成一个段落。要生成一个中文段落,请传递 cn
。
mock(&json!("@Paragraph")); // String("eetcttp jekaveq uwzkl abzciz bquijz biq ajfbnsjx ljmy khx,..., iilxxy mudlb xjz eipnm wnuc, takktis dus vwmubs ysckswn bju uffje.")
// Chinese paragraph
mock(&json!("@Paragraph|cn")); // String("却国华资称被素火用几花放西等,...,层间者场当族表眼日技里度,际感高一声新历院器火常问书则如。")
@Sentence
随机生成一个句子。要生成一个中文句子,请传递 cn
mock(&json!("@Sentence")); //String("zcdh yiui qymurgx szaydjv yfb tkj znpeyy muzwrs okihyo")
// Chinese sentence
mock(&json!("@Sentence|cn")) // String("型有件次一通说存克这半确毛由")
@Title
随机生成一个标题。要生成一个中文标题,请传递 cn
。它类似于 @Sentence
。
mock(&json!("@Title")); // String("fivms iiqq kdvyojq mibvzkx efhi six zpogksf")
// Chinese title
mock(&json!("@Title|cn")); // String("别话省报回京老住基")
@Image
生成由https://dummyimage.com提供的图片的URL。可以指定大小、背景颜色和前景颜色,但不能仅定义背景或前景颜色。
// Default image size is 320X240, with black background and white foreground
mock(&json!("@Image")); // String("https://dummyimage.com/320X240/000/fff")
// Custom image size
mock(&json!("@Image|40X40")); // String("https://dummyimage.com/40X40/000/fff")
// Custom size and background color
mock(&json!("@Image|40X40|f00")); // String("https://dummyimage.com/40X40/f00/fff")
// Custom size, background color, and foreground color
mock(&json!("@Image|40X40|f00|fea")); // String("https://dummyimage.com/40X40/f00/fea")
@Number
默认情况下,随机生成一个介于0和1000之间的自然数。接受参数以使用 @Number|min~max
指定范围。
mock(&json!("@Number")); // Number(326)
mock(&json!("@Number|100~999")); //Number(437)
mock(&json!("@Number|-200~-100")); // Number(-147)
@Float
随机生成一个浮点数。接受两个可选参数。当只有一个参数时,如果该参数包含 ~
,它表示值的范围,否则,它表示小数点后的确切位数。当有两个参数时,第一个参数表示小数点后的确切位数,第二个参数表示值的范围。
// default precision is 2
mock(&json!("@Float")); // Number(0.13)
// Specify precision
mock(&json!("@Float|3")); // Number(0.628)
// Specify value range
mock(&json!("@Float|100~999")); // Number(123.56)
// Specify precision and value range
mock(&json!("@Float|2|100~999")); // Number(131.99)
@Zip
随机生成一个邮政编码。
mock(&json!("@Zip")); // String("859615")
@Address
随机生成一个地址。传递 cn
生成一个中文地址。
mock(&json!("@Address")); //String("2454 Kidd Avenue Anchorage Alaska")
// Generate a Chinese address
mock(&json!("@Address|cn")); //String("湖北省武汉市汉阳区仙山社区")
@Date
随机生成一个日期。格式可以自定义。
mock(&json!("@Date")); //String("1984-09-28")
// Custom date format
mock(&json!("@Date|YYYY/MM/DD")); //String("1918/01/13")
mock(&json!("@Date|YY/M/D")); //String("36/2/1")
@Time
随机生成一个时间。
mock(&json!("@Time")); //String("09:58:54")
@DateTime
随机生成一个日期和时间。格式可以自定义。
mock(&json!("@DateTime")); //String("1937-06-24 10:47:53")
// Custom format
mock(&json!("@DateTime|YYYY/MM/DD hh:mm:ss")); //String("2007/01/23 16:52:03")
@Timestamp
随机生成一个时间戳。
mock(&json!("@Timestamp")); //Number(1812982294012)
@Color
随机生成一个十六进制格式的颜色。
mock(&json!("@Color")); //String("#F4F54B")
@RGB
随机生成一个RGB格式的颜色。
mock(&json!("@RGB")); //String("rgb(79,134,9)")
@RGBA
随机生成一个RGBA格式的颜色。
mock(&json!("@RGBA")); //String("rgba(240,131,198,0.65)")
@HSL
随机生成一个HSL格式的颜色。
mock(&json!("@HSL")); //String("hsl(343,50,32)")
注册您的 占位符
上述都是当前可用的所有 占位符
。您也可以通过 registry
函数注册自己的 占位符
,它必须实现 MockFn
特性。但是,您不能注册已存在的 占位符
。虽然 占位符
没有严格的命名约定,但仍然建议使用驼峰命名法。除了像 RGB
这样的缩写。
例如:现在我想注册一个名为 placeholder
的占位符,称为 @CMYK
,用于生成 CMYK 格式的颜色。
pub struct MockCMYKFn;
impl MockFn for MockCMYKFn {
// Ignore the parameter since it is not used here.
fn mock(&self, _:Option<Vec<&str>>) -> Value {
let mut rng = rand::thread_rng();
let c = rng.gen_range(0..=100);
let m = rng.gen_range(0..=100);
let y = rng.gen_range(0..=100);
let k = rng.gen_range(0..=100);
json!(format!("cmyk({},{},{},{})", c, m, y, k))
}
}
// Register
registry("@CMYK", MockCMYKFn);
// Usage
mock(&json!("@CMYK")); // String("cmyk(99,20,87,54)))
依赖项
~1–1.8MB
~38K SLoC