【问题标题】:PHP json_encode - null & int values returned as stringsPHP json_encode - 作为字符串返回的 null 和 int 值
【发布时间】:2013-12-12 21:43:15
【问题描述】:

为什么会有这个数组:

Array
(
    [EventCode] => 20140709TXAO
    [ShortParticipant] => Array
        (
            [Address1] => null
            [Address2] => null
            [Address3] => null
            [City] => null
            [Country] => null
            [Email] => kkardashian@kkardashain.com
            [Employer] => TNA
            [FirstName] => Kim
            [LastName] => Kardashian
            [PID] => 1180133
            [Result] => null
            [State] => null
        )

)

用json_encode转换成下面的JSON?注意空值被转换为“空”!!!这导致我的接收器出现问题。

{
    "EventCode": "20140709TXAO",
    "ShortParticipant": {
        "Address1": "null",
        "Address2": "null",
        "Address3": "null",
        "City": "null",
        "Country": "null",
        "Email": "kkardashian@kkardashain.com",
        "Employer": "TNA",
        "FirstName": "Kim",
        "LastName": "Kardashian",
        "PID": "1180133",
        "State": "null"
    }
}

甚至 int 值也被转换为字符串“1180133”。

var_dump 结果:

array
  'EventCode' => string '20140709TXAO' (length=12)
  'ShortParticipant' => 
    array
      'Address1' => string 'null' (length=4)
      'Address2' => string 'null' (length=4)
      'Address3' => string 'null' (length=4)
      'City' => string 'null' (length=4)
      'Country' => string 'null' (length=4)
      'Email' => string 'kkardashian@kkardashain.com' (length=27)
      'Employer' => string 'TNA' (length=3)
      'FirstName' => string 'Kim' (length=3)
      'LastName' => string 'Kardashian' (length=10)
      'PID' => string '1180133' (length=7)
      'Result' => string 'null' (length=4)
      'State' => string 'null' (length=4)

Javascript 代码:

function callRegStatus(eventcode, RegStatus) {
    inputdata = {LogonTicket: logonticket, 
                 data2: $.extend(true, {EventCode: eventcode}, 
                                       {ShortParticipant: RegStatus})};
    ok_to_proceed = false;
    $.ajax({async: false
          , type:'POST'
          , url: REGFUNCTIONS_URL
          , data: inputdata
          , dataType: 'json'
          , success: function(data) {          
                ok_to_proceed = true;
            }
          , error: function(jqXHR, textStatus, errorThrown) {
                ok_to_proceed = false;
                $("#error_message").html(jqXHR.responseText);
            }
    });
    return ok_to_proceed;
}

EE插件代码:

 public function getRegStatus() {
    $data  = $_POST;
    $data2 = $data["data2"];

    $url = $this->server . '/RegStatus/'.$data["LogonTicket"];
    $options = array(CURLOPT_URL => $url,
                     CURLOPT_HEADER => false,
                     CURLOPT_SSL_VERIFYPEER => false,
                     CURLOPT_RETURNTRANSFER => true,
                     CURLOPT_POST => true,
                     CURLOPT_POSTFIELDS => json_encode($data2)
         );
    $ch = curl_init();
    curl_setopt_array($ch, $options);

    $RegStatusResult = curl_exec($ch);

    curl_close($ch); 
    return $RegStatusResult;
 }

【问题讨论】:

  • kkardashian@kkardashain.com :D
  • 你忘了贴代码
  • 这不是json_encode的默认行为,正如@Musa所说,给我们看代码
  • 并显示该数组的var_dump(),而不是print_r(),以便我们查看类型和长度。
  • 这些只是带有单词null 的字符串,而不是NULL 值。

标签: php json


【解决方案1】:

在使用 JSON 对数据进行编码之前,您可以像这样进行递归数组遍历:

array_walk_recursive($array, function(&$item, $key) {
    if ($item == 'null') $item = NULL;
});

注意代码使用lambdas 并且需要PHP 5.3.0 或更高版本。但是,如果匿名函数在 array_walk_recursive 之前定义,然后作为回调传递——就像 array_walk_recursive($array, 'nullStrToNull'); 一样,它可以很容易地被重构。

对于被转换为字符串的整数,json_encode() 选项 JSON_NUMERIC_CHECK(自 PHP 5.3.3 起可用)会将数字字符串编码为数字。如果该选项不可用,我们也可以使用array_walk_recursive()

【讨论】:

    【解决方案2】:

    先转换为 UTF-8,例如

    $array = array_map('utf8_encode', array('one', 'two', null, 'three'));
    var_dump(json_encode($array));
    

    true/false 值也会遇到同样的问题。

    【讨论】:

      猜你喜欢
      • 2016-12-08
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多