我正在使用Zoho CRM。我从他们的API获得的响应格式对我来说似乎有点奇怪;我不能像往常一样从中拉出一个物体。我试图使用PHP解析结果。以下是他们的回复格式示例:
{
"response": {
"result": {
"SalesOrders": {
"row": {
"FL": [
{
"content": "6666666000000000000",
"val": "SALESORDERID"
},
{
"content": "Order",
"val": "Subject"
},
{
"content": "Pending",
"val": "Status"
},
{
"content": "John Smith",
"val": "Order Owner"
},
{
"content": "Canada",
"val": "Billing Country"
},
{
"product": {
"FL": [
{
"content": "5555555000000000000",
"val": "Product Id"
},
{
"content": "Roller Coaster",
"val": "Product Name"
}
],
"no": "1"
},
"val": "Product Details"
},
"content": "Pending",
"val": "Ticket Status"
}
],
"no": "1"
}
}
},
"uri": "/crm/private/json/SalesOrders/getRecordById"
}
}
我尝试做的是获取产品的产品ID(在这种情况下,值为" 5555555000000000000"。
每个响应都具有相同的结构,但是我无法使用索引来解析键/值,因为API调用之间的字段数量可能会发生变化(意味着产品的索引可能是5,如上所述,或7或8,或其他任何取决于被拉入的字段数量)。我不明白为什么他们没有使用典型的键/值对,例如" Product_ID":" 5555555000000000000"这将使所有这一切都成为无问题。
有没有办法在不迭代每个键/值对寻找" val" "产品ID"然后抓住相关的内容" (这是我正在寻找的产品ID)?这是我能想到的唯一方式,而且看起来效率不高。
答案 0 :(得分:1)
PHP有一个函数:json_decode。见http://php.net/manual/en/function.json-decode.php
$response = "... your JSON response from wherever ...";
$data = json_decode($response, true);
// Access the nested arrays any way you need to, such as ...
$orders = $data["response"]["result"]["SalesOrders"];
foreach ($orders["row"]["FL"] as $item) {
if (array_key_exists("product", $item) {
echo $item["product"]["FL"][0]["content"];
}
}
编辑:将第二个arg更正为json_decode(感谢Marcin)
答案 1 :(得分:0)
我不明白他们为什么不使用典型的键/值对,例如“Product_ID”:“5555555000000000000”会使所有这些都成为非问题。
有没有办法做到这一点,而不是遍历每个键/值对寻找“产品ID”的“val”,然后抓取相关的“内容”(这是我正在寻找的产品ID)?
不,(即使您使用json_decode($data, true)
将其转换为数组并使用命名键继续),您最终会迭代或测试密钥存在(需要到产品-FL-val来获取产品) -FL-内容)。也许带回调的array_fiter
或array_walk
可以解决问题,但它们也会在内部进行迭代。
我的建议是安全一段时间并使用现有的套餐,例如
https://github.com/cristianpontes/zoho-crm-client-php
或在Packagist https://packagist.org/search/?q=zoho
上搜索一个答案 2 :(得分:0)
我不知道这可能有所帮助。但这就是我用于 Zoho APP 的内容。实际上我正在使用 Zoho 开发一个PHP应用程序。你的JSON和我的JSON是一样的,但是我正在获得优惠,而你正在获得SalesORders。
<?php
$token = $_SESSION['token'];
$url = "https://crm.zoho.com/crm/private/json/Deals/getRecordById?authtoken=$token&scope=crmapi&id=$dealID";
$result = file_get_contents($url);
$deal_detail = json_decode($result);
$deal_detail = json_decode(json_encode($deal_detail), True);
$deal_detail_array = array();
//Instead of Deals you have SalesOrder right
foreach($deal_detail['response']['result']['Deals']['row']['FL'] as $array){
$deal_detail_array[$array['val']] = $array['content'];
}
echo $deal_detail_array['DEALID']; // You can change this to SALEORDERID, get data correctly every time.
echo $deal_detail_array['Deal Name'];
echo $deal_detail_array['Amount'];
///.......and so on ..............//
//................................//
只有你的JSON和我之间的区别是:你在结果字段后的JSON中有“ SalesOrders ”而在我的json而不是SalesOrders中我有在那里交易。
这段代码对我来说很好。所以你可以做同样的事情,除了现场更新。我为每个请求正确获取 DEALID ,同样可以为您提供 SALESORDERID