如何使用映射中的 nginx 正则表达式提取 json 中的键值

how to nginx regex in map to extract value of a key in json

我有一个 json 请求正文到达 nginx

{
    "studentName": "John",
    "studentId": "100",
    "narks": "100"
}

我正在使用 NGINX $map 提取 studentName 的值并将其映射到变量。 现在我正在使用手动提取已知值

map $request_body $student_uid {
    
    default "john"
    ~*"john" "john";
    ~*"jack" "jack";
    ~*"jill" "jill";
    }

我必须提取学生姓名并存储在 student_uid 值中..这样做的正则表达式是什么?不想为此使用任何额外的 nginx 模块

使用此 map 块从请求正文中提取 studentName JSON 字段:

map $request_body $student_name {
    ~\"studentName\"\s*:\s*\"([^\"]*)\"    ;
}

如果您想将此与您之前的问题结合起来,您可以链接两个 map 块:

map $request_body $student_name {
    ~\"studentName\"\s*:\s*\"([^\"]*)\"    ;
}
map $student_name $student_status {
    Bob        special;
    Alice      special;
    John       regular;
    ...
}

更新

如果您的 JSON 字段可以包含屏蔽双引号,例如

{
    "studentName": "Mike \"Iron\" Tyson",
    "studentId": "100",
    "marks": "100"
}

上面的正则表达式只会捕获字段的第一部分(Mike \ 对于上面的例子)。要捕获整个字段,您需要更复杂的正则表达式:

map $request_body $student_name {
    \"studentName\"\s*:\s*\"((?:[^\\"]|\.)*)\"    ;
}