Skip to content

Instantly share code, notes, and snippets.

@ctkjose
Last active October 1, 2018 16:14
Show Gist options
  • Save ctkjose/f784d6bd2a163d54947969f5bd7249a0 to your computer and use it in GitHub Desktop.
Save ctkjose/f784d6bd2a163d54947969f5bd7249a0 to your computer and use it in GitHub Desktop.
Handling JSON Data in PHP

Handling a JSON request

If data is send with a traditional multipart/form-data or application/x-www-form-urlencoded JSON data in FORM values will be automatically be converted and available in its corresponding $_POST, $_REQUEST or $_GET global.

This scenario is handle fairly simple with:

<?
$data = @json_decode($_POST['json_field']);

Thats not the case with json data sent as "application/json".

<?
$data = @json_decode(($fp = fopen('php://input', 'r')) !== false ? stream_get_contents($fp) : "{}", true);
$_POST = array_merge($_POST, (array) json_decode(file_get_contents('php://input')));

As of PHP 5.6 you have the global variable $HTTP_RAW_POST_DATA to get the raw POST data.

This example is a failsafe handling of json data that will always return an associative array. If no valid data is found an empty array is returned.

<?
if($_SERVER['REQUEST_METHOD'] != 'POST') return [];

//optional check of a "application/json" as CONTENT_TYPE 
$mime = isset($_SERVER["CONTENT_TYPE"]) ? strtolower(trim($_SERVER["CONTENT_TYPE"])) : '';
if($mime != 'application/json') return [];

//read input or fake it
$payload = ($fp = fopen('php://input', 'r')) !== false ? stream_get_contents($fp) : "{}";

$data = @json_decode($payload, true);
if(!is_array($data)) return [];

return $data;

Handle Errors

<?

$data = @json_decode($json, true);
if(!is_array($data)){
  //json was not converted...
}

Using the function json_last_error() added since 5.3.0:

<?

$data = @json_decode($json, true);
$err = json_last_error();
if($err != JSON_ERROR_NONE){
  //json was not converted...
}

Sending data from Javascript using JQuery

An example sending JSON data with JQuery that is available in your $_POST.

var data = {};
data.json = JSON.stringify(record);

var url = "https://mysite.com/myscript.php";

//call my php
$.ajax({
    type: 'POST',
    url: url,
    data: data,
    dataType: 'json' //expects json data in response
}).done( function( data ){

}).fail( function( data ){

});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment