使用来自 OData v4 API 响应的以下 JSON 对象:
{
"@odata.context": "https://api.asdfasdf.com/",
"@odata.count": 2,
"value": [
{
"id": 123456789,
"name": "Random name"
},
{
"id": 15345,
"name": "Random name2"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这适用于选择数组中的对象:
$.value[?(@.id == 123456789)]
使用这个 JSONPath 我可以获得属性“@odata.count”的值:
$.['@odata.count']
但是如何使用“@odata.count”用表达式编写 JSONPath 呢?例如。仅当计数大于 1 时才选择,这些表达式失败:
$.[('@odata.count' > 1)]
$.[?('@odata.count' > 1)]
$.[(@.['@odata.count'] > 1)]
... and a lot of other expressions
Run Code Online (Sandbox Code Playgroud)
我坚信我正在研究与我想象的不同深度的 json,并且属性的命名约定(以及选择它的方式)让我发疯。
最终目标是在 SoapUI 测试套件断言中使用表达式。
将响应中的“@odata.count”属性与我们的测试数据进行比较。
编辑: 感谢评论者,通过删除数字后的引号来修复 json。
以及帮助我找到解决方案的表达式的其他发现:
这些表达式的结果是“2”:
$['@odata.count']
$..[0]['@odata.count']
Run Code Online (Sandbox Code Playgroud)
此表达式产生一个空数组:
$..[?(@['@odata.count'] > 1)]
Run Code Online (Sandbox Code Playgroud)
此表达式的结果为“null”:
?($['@odata.count'] > 1) …
Run Code Online (Sandbox Code Playgroud) 在 PHP 中,我发现当小数点被打印到屏幕上时(或者:当它被转换为字符串时),小数点分隔符也将被转换为逗号。但这是为什么呢?我还没有找到任何关于此的文档,我认为转换为字符串不会考虑国际化设置。
示例代码:
$var = 12.345;
var_dump($var); // Outputs: double(12.345)
var_dump((string)$var); // Outputs: string(6) "12,345"
var_dump(str_replace(',', '.', $var)); // Outputs: string(6) "12.345"
echo $var; // Outputs: 12,345
Run Code Online (Sandbox Code Playgroud)
是什么导致了这种行为?
这个问题适用于 PHP < 8。根据文档,
自 PHP 8.0.0 起,小数点字符始终为
.
. 在 PHP 8.0.0 之前,小数点字符在脚本的语言环境(类别 LC_NUMERIC)中定义。请参阅 setlocale() 函数。