想在php中发送和接收json数据

时间:2014-05-23 00:50:49

标签: php json

根据应用程序的要求,我正在尝试开发两个可以通过Json相互通信的PHP。我尝试在线搜索,但没有找到解决方案。

任何人都可以建议我正确的道路吗?

我在mysql数据库中有数据,转换后的数据将采用json格式,如下所示:(还要查找通过PHP-JSON对象和数组获取此数据格式的代码。)

{ "user" : [   
             { "firstName" : "Vignesh",  
               "lastName"  : "Prajapati",
               "age"       : 23,
               "email"     : ["vignesh@gmail.com","vignesh@yahoo.com"],
               "subject"   : ["English","Gujarati", "Hindi"]
             }, 

             { "firstName" : "Vaibhav",  
               "lastName"  : "Prajapati",
               "age"       : 19,
               "email"     : ["vaibhav@gmail.com","vaibhav@yahoo.com","vaibhav@aol.com"],
               "subject"   : ["English","Spanish", "Chinese","Sanskrit"]
             }
           ]
} 

我发送Json数据的Php代码:(send.php)

<?php

$data = '    { "user" : [   
                 { "firstName" : "Vignesh",  
                   "lastName"  : "Prajapati",
                   "age"       : 23,
                   "email"     : ["vignesh@gmail.com","vignesh@yahoo.com"],
                   "subject"   : ["English","Gujarati", "Hindi"]
                 }, 

                 { "firstName" : "Vaibhav",  
                   "lastName"  : "Prajapati",
                   "age"       : 19,
                   "email"     : ["vaibhav@gmail.com","vaibhav@yahoo.com","vaibhav@aol.com"],
                   "subject"   : ["English","Spanish", "Chinese","Sanskrit"]
                 }
               ]
    } ';

$url_send ="http://localhost/rec.php";
$str_data = json_encode($data);

function sendPostData($url, $post){
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");  
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
  $result = curl_exec($ch);
  curl_close($ch);  // Seems like good practice
  return $result;
}

echo " " . sendPostData($url_send, $str_data);

?>

我接收Json数据的Php代码:(rec.php)

<?php

$json_input_data=json_decode(file_get_contents('php://input'),TRUE);

echo $json_input_data;


?>

3 个答案:

答案 0 :(得分:2)

修改您的函数以在post post

中发送JSON_DATA的标头
function sendPostData($url, $post){
 $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");  
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
  curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($post))                                                                       
   );  
  $result = curl_exec($ch);
  curl_close($ch);  // Seems like good practice
  return $result;
}

在文件使用中

<?php

$json_input_data=json_decode(file_get_contents('php://input'),TRUE);

print_r( $json_input_data);


?>

正如大家所说,不需要$str_data = json_encode($data);,因为数据已经在json中。

答案 1 :(得分:1)

如果数据已经采用json_encode格式,则不应使用json,请将代码更改为:

$data = array('user' => array(
         array('firstName' => 'Vignesh', 'lastName' => 'Prajapati'),
         array('firstName' => 'Vaibhav', 'lastName' => 'Prajapati')
       ));

当然,您还需要将其他字段添加到数组中。

在上述数据上使用json_encode()将返回:

{
   "user" : [
     {
      "firstName" : "Vignesh",
      "lastName" : "Prajapati"
     },
     {
      "firstName" : "Vaibhav",
      "lastName" : "Prajapati"
     }
   ]
 }

答案 2 :(得分:1)

请记住,JSON表示“对象表示法”,即它是一种在javascript中描述对象的方法。这是在网络级别进行通信的好方法,但是当您使用PHP时,您应该使用PHP旨在使用的数据结构。而不是直接在任何一方使用JSON,尤其是作为大JSON字符串的替代,将数据结构化为数组并在发送之前对其进行编码。你使用curl的方法很好,虽然有点习惯 - 有很多很好的路由器可以更好地管理这些类型的请求(symfony是我最喜欢的),但这是一个单独的问题。

e.g。而不是你的大字符串,代表它:

$data = 
    [ "user" => [   
                 [ "firstName" => "Vignesh",  
                   "lastName"  => "Prajapati",
                   "age"       => 23,
                   "email"     => ["vignesh@gmail.com","vignesh@yahoo.com"],
                   "subject"   => ["English","Gujarati", "Hindi"]
                 ]

等。 到了将时间发送到其他服务器时,json_encode并转到。