减少免费标记模板中的空检查
Reducing null check in free marker templete
我有 json:
{"getKycBusinessDetailsResponse":
{"ADDRESS":
{"fieldDataResponse":
{ "dataValue":
{"__type": "com.amazon.skies#AddressData",
"addressId": "2BH6RKV6KLU4OAFIQGOEG12IX7FW7W7I6A2H6I7W7WF7XILPXTQ2EIA2OX4BY72H"},
"isEditable": false,
"isMandatory": false,
"isUpdateRequired": false},
"fieldDocumentsResponse":
{"documentValue":
{},
"isMandatory": false,
"isUpdateRequired": false}
}
}
}
我想从上面的 Json 中提取 addressId 值,这是我所做的:
<#if getKYCBusinessData??>
<#assign getKYCBusinessData = (getKYCBusinessData)?eval>
<#if getKYCBusinessData.getKycBusinessDetailsResponse?? && getKYCBusinessData.getKycBusinessDetailsResponse?has_content>
<#assign businessDetails = getKYCBusinessData.getKycBusinessDetailsResponse>
<#if businessDetails.ADDRESS?? && businessDetails.ADDRESS?has_content>
<#assign ADDRESS = businessDetails.ADDRESS>
<#if ADDRESS.fieldDataResponse?? && ADDRESS.fieldDataResponse?has_content>
<#assign fieldDataResponse = ADDRESS.fieldDataResponse>
<#if fieldDataResponse.dataValue?? && fieldDataResponse.dataValue?has_content>
<#assign dataValue = fieldDataResponse.dataValue>
<#if dataValue.addressId?? && dataValue.addressId?has_content>
<#assign addressId = dataValue.addressId>
{
"addressId" : "${addressId}"
}
</#if>
</#if>
</#if>
</#if>
</#if>
</#if>
正如您在此处看到的,要提取地址 ID,需要应用多个空值检查。这里如何减少空检查的数量?
他们的关键是了解 (...)!
构造,它会同时生成 []
(以及 ""
和 false
,但我们不知道如果由于缺少变量而失败,则在内部表达式中使用它)。使解决方案仍然冗长的原因是,如果打印在其中的内容退出,则只需要输出中的 { ... }
。为了解决这个问题,我将结果视为一个长度为 0 或 1 的列表:
<#list ([ getKYCBusinessData.getKycBusinessDetailsResponse.ADDRESS
.fieldDataResponse.dataValue.addressId ])! as it>
{
"addressId": "${it}"
}
</#list>
另一种方法是 #assign
并执行 #if
,但是,它无法区分真正缺失的值与存在但有值的值像 ""
:
<#assign opt = (getKYCBusinessData.getKycBusinessDetailsResponse.ADDRESS
.fieldDataResponse.dataValue.addressId)!>
<#if opt?has_content>
{
"addressId": "${opt}"
}
</#if>
我有 json:
{"getKycBusinessDetailsResponse":
{"ADDRESS":
{"fieldDataResponse":
{ "dataValue":
{"__type": "com.amazon.skies#AddressData",
"addressId": "2BH6RKV6KLU4OAFIQGOEG12IX7FW7W7I6A2H6I7W7WF7XILPXTQ2EIA2OX4BY72H"},
"isEditable": false,
"isMandatory": false,
"isUpdateRequired": false},
"fieldDocumentsResponse":
{"documentValue":
{},
"isMandatory": false,
"isUpdateRequired": false}
}
}
}
我想从上面的 Json 中提取 addressId 值,这是我所做的:
<#if getKYCBusinessData??>
<#assign getKYCBusinessData = (getKYCBusinessData)?eval>
<#if getKYCBusinessData.getKycBusinessDetailsResponse?? && getKYCBusinessData.getKycBusinessDetailsResponse?has_content>
<#assign businessDetails = getKYCBusinessData.getKycBusinessDetailsResponse>
<#if businessDetails.ADDRESS?? && businessDetails.ADDRESS?has_content>
<#assign ADDRESS = businessDetails.ADDRESS>
<#if ADDRESS.fieldDataResponse?? && ADDRESS.fieldDataResponse?has_content>
<#assign fieldDataResponse = ADDRESS.fieldDataResponse>
<#if fieldDataResponse.dataValue?? && fieldDataResponse.dataValue?has_content>
<#assign dataValue = fieldDataResponse.dataValue>
<#if dataValue.addressId?? && dataValue.addressId?has_content>
<#assign addressId = dataValue.addressId>
{
"addressId" : "${addressId}"
}
</#if>
</#if>
</#if>
</#if>
</#if>
</#if>
正如您在此处看到的,要提取地址 ID,需要应用多个空值检查。这里如何减少空检查的数量?
他们的关键是了解 (...)!
构造,它会同时生成 []
(以及 ""
和 false
,但我们不知道如果由于缺少变量而失败,则在内部表达式中使用它)。使解决方案仍然冗长的原因是,如果打印在其中的内容退出,则只需要输出中的 { ... }
。为了解决这个问题,我将结果视为一个长度为 0 或 1 的列表:
<#list ([ getKYCBusinessData.getKycBusinessDetailsResponse.ADDRESS
.fieldDataResponse.dataValue.addressId ])! as it>
{
"addressId": "${it}"
}
</#list>
另一种方法是 #assign
并执行 #if
,但是,它无法区分真正缺失的值与存在但有值的值像 ""
:
<#assign opt = (getKYCBusinessData.getKycBusinessDetailsResponse.ADDRESS
.fieldDataResponse.dataValue.addressId)!>
<#if opt?has_content>
{
"addressId": "${opt}"
}
</#if>