首页 > 解决方案 > 使用 cURL 在 PHP 中发布嵌套数组

问题描述

我有一些数据需要发布到一个嵌套数组的端点,例如:

$contentPostData = array(
            'contents' => array(
                'name' => $comment_text,
                'fingerprint' => $fingerprint,
                'signers' => array(
                    $ownerAuthId
                )
            )
        );

当我尝试:

json_encode($contentPostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

我得到错误:

string(518) "{"timestamp":1578447151168,"message":"Can't read request","details":["JSON parse error: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException

如何格式化 contentPostData 以便正确反序列化?

标签: phpjsoncurldeserialization

解决方案


你提到:

json_encode($contentPostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

但是您是否将编码的 json 分配给$data? 我的意思是:你在做什么:

$data = json_encode($contentPostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

我看到您调用的 Web 服务com.fasterxml.jackson很可能使用 JSON 格式,因此您的序列化应该没问题(如果字段名称和类型匹配)。

我还建议设置标头以通知 Web 服务您正在发送 json 文件(以防它允许其他格式):

curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json'                                                                     
);

所以:

$data = json_encode($contentPostData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json'                                                                       
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

如果这不起作用,那么很可能:a)您的 JSON 无效(需要不同的结构)或 b)Web 服务实际上需要与 JSON 不同的格式(例如,可能是标准的多部分数据)


推荐阅读