Что означает знак at (@) в сериализованном массиве? [Дубликат]

Это означает, нотации.

Когда я попробовал ответ, предоставленный @metasequoia, возвращаемый вектор имел начальные пробелы, а не 0 s. Это была та же проблема, о которой упоминал @ user1816679 - и удаление цитат вокруг 0 или изменение с %d на %s тоже не имело значения. FYI, я использую RStudio Server, работающий на сервере Ubuntu. Это небольшое двухшаговое решение работало для меня:

gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))

, используя функцию %>% pipe из пакета magrittr, это могло бы выглядеть так:

sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)

Я бы предпочел однофункциональное решение, но оно работает.

52
задан Steve Matthews 25 September 2013 в 18:31
поделиться

3 ответа

У вас есть пустой $_POST. Если ваш веб-сервер хочет видеть данные в json-формате, вам нужно прочитать исходный ввод, а затем проанализировать его с помощью декодирования JSON.

Вам нужно что-то вроде этого:

$json = file_get_contents('php://input');
$obj = json_decode($json);

Также у вас неправильный код для тестирования JSON-связи ...

CURLOPT_POSTFIELDS сообщает curl, чтобы кодировать ваши параметры как application/x-www-form-urlencoded. Вам нужна JSON-строка.

UPDATE

Ваш php-код для тестовой страницы должен быть таким:

$data_string = json_encode($data);

$ch = curl_init('http://webservice.local/');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
);

$result = curl_exec($ch);
$result = json_decode($result);
var_dump($result);

Также на странице вашего веб-сервиса вы должны удалить одну из строк header('Content-type: application/json');. Его нужно вызывать только один раз.

115
ответ дан Michael Sivolobov 19 August 2018 в 13:37
поделиться
  • 1
    Спасибо, Майкл, это была большая помощь, можете ли вы взглянуть на мое редактирование и посмотреть, можете ли вы увидеть что-нибудь еще, что вызывает мою проблему? – Steve Matthews 25 September 2013 в 18:30
  • 2
    Я обновил свой ответ, чтобы показать ваши общие ошибки. – Michael Sivolobov 26 September 2013 в 03:39
  • 3
    Человек, это было так полезно! Код $ json = file_get_contents ('php: // input'); $ obj = json_decode ($ json); Отлично работает – Cleversou 28 February 2017 в 15:28
  • 4
    Я испугался, что тебе нужно целый день заняться этой задачей ... Но круто это сработало первым выстрелом менее чем за 2 минуты! Огромное вам спасибо, теперь я могу притворяться, что это тяжело и взять выходной ... – Shadowbob 14 March 2017 в 12:56

вы можете поместить свой json в параметр и отправить его вместо того, чтобы помещать только ваш json в заголовок:

$post_string= 'json_param=' . json_encode($data);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $post_string);
curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/');  // Set the url path we want to call

//execute post
$result = curl_exec($curl);

//see the results
$json=json_decode($result,true);
curl_close($curl);
print_r($json);

на стороне службы вы можете получить свою строку json в качестве параметра:

$json_string = $_POST['json_param'];
$obj = json_decode($json_string);

, тогда вы можете использовать преобразованные данные как объект.

0
ответ дан morteza kavakebi 19 August 2018 в 13:37
поделиться

Привет, это фрагмент старого проекта, который использует curl для получения ip-информации от некоторых бесплатных служб ip-баз данных, которые отвечают в json-формате. Я думаю, что это может вам помочь.

$ip_srv = array("http://freegeoip.net/json/$this->ip","http://smart-ip.net/geoip-json/$this->ip");

getUserLocation($ip_srv);

Функция:

function getUserLocation($services) {

        $ctx = stream_context_create(array('http' => array('timeout' => 15))); // 15 seconds timeout

        for ($i = 0; $i < count($services); $i++) {

            // Configuring curl options
            $options = array (
                CURLOPT_RETURNTRANSFER => true, // return web page
                //CURLOPT_HEADER => false, // don't return headers
                CURLOPT_HTTPHEADER => array('Content-type: application/json'),
                CURLOPT_FOLLOWLOCATION => true, // follow redirects
                CURLOPT_ENCODING => "", // handle compressed
                CURLOPT_USERAGENT => "test", // who am i
                CURLOPT_AUTOREFERER => true, // set referer on redirect
                CURLOPT_CONNECTTIMEOUT => 5, // timeout on connect
                CURLOPT_TIMEOUT => 5, // timeout on response
                CURLOPT_MAXREDIRS => 10 // stop after 10 redirects
            ); 

            // Initializing curl
            $ch = curl_init($services[$i]);
            curl_setopt_array ( $ch, $options );

            $content = curl_exec ( $ch );
            $err = curl_errno ( $ch );
            $errmsg = curl_error ( $ch );
            $header = curl_getinfo ( $ch );
            $httpCode = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );

            curl_close ( $ch );

            //echo 'service: ' . $services[$i] . '</br>';
            //echo 'err: '.$err.'</br>';
            //echo 'errmsg: '.$errmsg.'</br>';
            //echo 'httpCode: '.$httpCode.'</br>';
            //print_r($header);
            //print_r(json_decode($content, true));

            if ($err == 0 && $httpCode == 200 && $header['download_content_length'] > 0) {

                return json_decode($content, true);

            } 

        }
    }
1
ответ дан Syd 19 August 2018 в 13:37
поделиться
  • 1
    Спасибо за фрагмент кода, но я думаю, что моя проблема связана с сайтом webservice / PHP, а не с кодом CURL (хотя не стесняйтесь говорить мне иначе, поскольку я не 100%). Я думаю, что это мои значения PHP $ _POST и нужно ли им быть json_encoded или что-то еще. – Steve Matthews 25 September 2013 в 14:26
  • 2
    hmm попробуйте добавить это к вашему curl curl_setopt ($ curl, CURLOPT_UPLOAD, 1); – Syd 25 September 2013 в 14:39
Другие вопросы по тегам:

Похожие вопросы: