php - 使用 PHP 将值插入 JSON 对象
问题描述
我正在尝试编写一个脚本,该脚本允许定义表单字段并基于此编写 JSON 模式。
{
"createContact":{
"method":"POST",
"sobject":"Contact",
"Intangible\/Event.payload":{
"FirstName":"contact_first_name",
"LastName":"contact_last_name",
"MobilePhone":"contact_phone",
"HomePhone":"contact_phone",
"npe01__PreferredPhone__c":"Mobile",
"MailingStreet":"address_unit_no",
"MailingCity":"address_suburb",
"MailingState":"address_state",
"MailingPostalCode":"address_postcode",
"MailingCountry":"address_country",
"npe01__HomeEmail__c":"contact_email",
"npe01__Preferred_Email__c":"Personal",
"Stripe_Customer_ID__c":"stripe_customer_id"
}
},
"createOpportunity":{
"method":"POST",
"sobject":"Opportunity",
"Intangible\/Event.payload":{
"StageName":"stage_name",
"Type":"donation_type",
"Amount":"donation_amount",
"PD_Payment_Method__c":"Web",
"CampaignId":"campaign_id",
"RecordTypeId":"record_id",
"Name":"opportunity_name",
"CloseDate":"date",
"Description":"description",
"Stripe_Card_ID__c":"stripe_card",
}
}
}
我已经设置了虚拟值,我想从表单输入中替换这些值。还有某些字段,例如 Stripe_Customer_ID__c 等,需要在成功交易后从 Stripe 填充。
我尝试将 JSON 对象转换为 PHP 对象,然后使用 foreach 循环填充这些值,但是由于某些字段不是表单的一部分,因此证明有点挑战性。我希望能够重用代码,以便如果用户更改架构和表单字段,代码仍然会选择它并添加正确的值。
例如,如果Stripe_Card_ID__c
更改为Stripe_Card__c
我希望代码能够获取并分配正确的值。
我想知道是否有一种更简单的方法来处理映射,而不使用 foreach 循环来处理不确定的数据。
我目前写的代码
foreach($mapping as $mapping_key => $mapping_event){
if(is_object($mapping_event)){
foreach($mapping_event as $key => $value){
if(is_object($value)){
foreach($value as $inner_key => $inner_value){
if(isset($data[$inner_value])){
$event[$mapping_key][$key][$inner_key] = (string)$data[$inner_value];
}else{
$event[$mapping_key][$key][$inner_key] = $inner_value;
}
}
}else{
$event[$mapping_key][$key] = $value;
if($value == 'query'){
$event[$mapping_key][$key] = "";
}
}
}
}else{
$event[$mapping_key] = $mapping_event;
}
}
这确实会输出它从表单中提取的某些字段,但是每个 Salesforce 帐户的更独特的字段是硬位。
array(4) {
["createContact"]=>
array(3) {
["method"]=>
string(4) "POST"
["sobject"]=>
string(7) "Contact"
["Intangible/Event.payload"]=>
array(13) {
["FirstName"]=>
string(3) "asd"
["LastName"]=>
string(3) "asd"
["MobilePhone"]=>
string(13) "contact_phone"
["HomePhone"]=>
string(13) "contact_phone"
["npe01__PreferredPhone__c"]=>
string(6) "Mobile"
["MailingStreet"]=>
string(36) "address_unit_no"
["MailingCity"]=>
string(3) "asd"
["MailingState"]=>
string(3) "asd"
["MailingPostalCode"]=>
string(3) "asd"
["MailingCountry"]=>
string(2) "AF"
["npe01__HomeEmail__c"]=>
string(11) "asd@asd.asd"
["npe01__Preferred_Email__c"]=>
string(8) "Personal"
["Stripe_Customer_ID__c"]=>
string(18) "stripe_customer_id"
}
}
["createOpportunity"]=>
array(3) {
["method"]=>
string(4) "POST"
["sobject"]=>
string(11) "Opportunity"
["Intangible/Event.payload"]=>
array(13) {
["StageName"]=>
string(10) "stage_name"
["Type"]=>
string(4) "once"
["Amount"]=>
string(2) "52"
["PD_Payment_Method__c"]=>
string(3) "Web"
["CampaignId"]=>
string(11) "campaign_id"
["RecordTypeId"]=>
string(9) "record_id"
["Name"]=>
string(16) "opportunity_name"
["CloseDate"]=>
string(4) "date"
["Description"]=>
string(11) "description"
["Platform_Donation_ID__c "]=>
string(0) ""
["Stripe_Card_ID__c"]=>
string(11) "stripe_card"
["Stripe_Fingerprint__c "]=>
string(18) "stripe_fingerprint"
["Conga_Trigger__c"]=>
string(13) "conga_trigger"
}
}
......
}
如您所见,上述结果仅具有已替换的某些字段。
解决方案
我最终单独管理每个阵列。鉴于领域的差异,我发现这更容易。我必须硬编码的某些字段可能会在其他时间查看,但初稿可以正常工作,这是个好消息。
推荐阅读
- vue.js - 在 vue.js 的 UL 中渲染 LI。有隐形标签吗?
- javascript - 在 Svelte onMount 回调中使用流星数据订阅错误
- java - Java regex 不会查找第一个以外的单词
- c# - .Net Core 3.1 HttpClient Headers.TryAddWithoutValidation 不工作
- eclipse - 有没有办法在 Eclipse 中删除 Maven 启动配置?
- go - AppEngine 部署找不到 Go 包
- c# - Unity OnClick.AddListener 停止工作
- php - 如何仅从数组中提取值?
- python - 了解 librosa.feature.spectral_contrast
- ios - Xcode 更新后应用行为的变化