#json #mocking #generate-json #serde-json #json-format

mock_json

一个非常简单的模拟 JSON 工具

9 个版本

0.1.8 2023 年 5 月 25 日
0.1.7 2023 年 5 月 19 日

#47电子邮件

Download history 2/week @ 2024-03-16 26/week @ 2024-03-30 11/week @ 2024-04-06 2/week @ 2024-05-18

每月 95 次下载

MIT/Apache

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")

@Email

随机生成一个电子邮件地址,不接受参数。

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