PHP中如何在未知字段参数时获取Helloworks API的JSON记录值
问题描述
我正在使用Helloworks API,以下PHP代码可通过curl正确且成功地打印姓名、邮箱和年龄的JSON记录:
$response='{"data":{"audit_trail_hash":"ba8b9942b55e4e0fdad66a43cc4be257a4dfc3b632d594b690a2ecc2ea5ae8ef","data":{"form_Hpp8Ml":{"field_DMoHYX":"nancy","field_vprQI8":"nancy@gmail.com" ,"field_bvc876":"24 years"}},"document_hashes":{"form_Hpp8Ml":"ab906e7f19810e47559c45b3a43b4647b9d567c2b90acb8581c10d4e6fd51bb8"},"id":"aBQm8GHZcsjF64TD","metadata":null,"mode":"live","status":"completed","workflow_id":"OcoAStmswMbrEem2"}} '; $json = json_decode($response, true); // print_r($json); echo "<br><br>"; echo $name= $json["data"]["data"]["form_Hpp8Ml"]["field_DMoHYX"]; echo $email= $json["data"]["data"]["form_Hpp8Ml"]["field_vprQI8"]; echo $age= $json["data"]["data"]["form_Hpp8Ml"]["field_bvc876"];
form_Hpp8Ml、field_DMoHYX、field_vprQI8、field_bvc876这4个字段参数是Helloworks.com API针对不同用户输入返回的随机字段,我不想每次展示记录时都修改这些字段参数,是否有办法动态绕过或处理这些随机参数来获取姓名、邮箱和年龄的记录?
解决方案
可以通过遍历动态键名的方式获取数据,无需硬编码随机字段:
方法1:按字段顺序提取
因为返回的表单数据通常只有一个随机命名的form节点,直接用current()获取表单内容,再按顺序提取字段值:
$response='{"data":{"audit_trail_hash":"ba8b9942b55e4e0fdad66a43cc4be257a4dfc3b632d594b690a2ecc2ea5ae8ef","data":{"form_Hpp8Ml":{"field_DMoHYX":"nancy","field_vprQI8":"nancy@gmail.com" ,"field_bvc876":"24 years"}},"document_hashes":{"form_Hpp8Ml":"ab906e7f19810e47559c45b3a43b4647b9d567c2b90acb8581c10d4e6fd51bb8"},"id":"aBQm8GHZcsjF64TD","metadata":null,"mode":"live","status":"completed","workflow_id":"OcoAStmswMbrEem2"}} '; $json = json_decode($response, true); // 获取唯一的表单数据(跳过随机form键) $formData = current($json["data"]["data"]); // 按顺序提取:姓名、邮箱、年龄 $values = array_values($formData); $name = $values[0]; $email = $values[1]; $age = $values[2]; echo $name . "<br>"; echo $email . "<br>"; echo $age . "<br>";
方法2:按内容特征匹配
如果字段顺序不确定,可通过内容格式判断类型:
$json = json_decode($response, true); $formData = current($json["data"]["data"]); $name = ''; $email = ''; $age = ''; foreach ($formData as $value) { // 匹配邮箱格式 if (filter_var($value, FILTER_VALIDATE_EMAIL)) { $email = $value; } // 匹配年龄格式(包含years关键词) elseif (str_contains($value, 'years')) { $age = $value; } // 剩余内容判定为姓名 else { $name = $value; } } echo $name . "<br>"; echo $email . "<br>"; echo $age . "<br>";
补充说明
- 如果API可能返回多个随机form节点,可改用
foreach遍历$json["data"]["data"]处理每个表单 - 若内容特征不够明确,建议查看Helloworks API文档,确认是否返回字段元数据(如标签、类型),可基于元数据精准匹配
内容的提问来源于stack exchange,提问作者Nancy Moore
相关产品推荐
相关产品推荐

