...

View Full Version : PHP JSON Class v0.5



Jak-S
02-19-2006, 11:28 PM
Dont use this class, there is a better one (which i didnt know about), see mindlessLemmings post.

Ive written this class because I wanted to use JSON in an application Iím building, and wasnít too keen on making it rely on yet another extension to be installed on the server.

The class can be used to encode a php array or object into JavaScript Object Notation. The class only currently supports encoding, not decoding. This is because I personally only need it for encoding, and because Iím not currently sure how to go about scripting the decoder. I defiantly want to develop a decoder at some point (hence the 0.5 version number), but I donít currently have time to work out how to do it.

Anyway, let me know what you think.



<?php

/*----------------------------------------------------------------------
PHP JSON Class
==============
The PHP JSON Class can be used to encode a php array or object into
Java Script Object Notation, without the need for an additional PHP
Extension.

Normal usage is as follows:

$json = new json;
$encoded = $json->encode($var);
echo $encoded;

Version 0.5
Copyright Jack Sleight - www.reallyshiny.com
This script is licensed under the:
Creative Commons Attribution-ShareAlike 2.5 License
----------------------------------------------------------------------*/

class json {

/*--------------------------------------------------
Encode the variable/array/object
--------------------------------------------------*/

function encode($input) {

$output = $this->get(NULL, $input);

return $output;

}

/*--------------------------------------------------
Get the encoded variable
--------------------------------------------------*/

function get($key, $value, $parent = NULL) {

$type = $this->type($key, $value);

switch ($type) {

case 'object':
$value = '{'.$this->loop($value, $type).'}';
break;
case 'array':
$value = '['.$this->loop($value, $type).']';
break;
case 'number':
$value = $value;
break;
case 'string':
$value = '"'.$this->escape($value).'"';
break;
case 'boolean':
$value = ($value) ? 'true' : 'false';
break;
case 'null':
$value = 'null';
break;

}

if(!is_null($key) && $parent != 'array')
$value = '"'.$key.'":'.$value;

return $value;

}

/*--------------------------------------------------
Check the type of the variable
--------------------------------------------------*/

function type($key, $value) {

if(is_object($value)) {
$type = 'object';
}
elseif(is_array($value)) {
if($this->is_assoc($value))
$type = 'object';
else
$type = 'array';
}
elseif(is_int($value) || is_float($value)) {
$type = 'number';
}
elseif(is_string($value)) {
$type = 'string';
}
elseif(is_bool($value)) {
$type = 'boolean';
}
elseif(is_null($value)) {
$type = 'null';
}
else {
die($key.' is of an unsupported type.');
}

return $type;

}

/*--------------------------------------------------
Loop through the array/object
--------------------------------------------------*/

function loop($input, $type) {

$output = NULL;

foreach($input as $key => $value) {
$output .= $this->get($key, $value, $type).',';
}

$output = trim($output, ',');

return $output;

}

/*--------------------------------------------------
Escape strings
--------------------------------------------------*/

function escape($string) {

$find = array('\\', '"', '/', "\b", "\f", "\n", "\r", "\t", "\u");
$repl = array('\\\\', '\"', '\/', '\b', '\f', '\n', '\r', '\t', '\u');

$string = str_replace($find, $repl, $string);

return $string;

}

/*--------------------------------------------------
Check if the array is associative
--------------------------------------------------*/

function is_assoc($array) {

krsort($array, SORT_STRING);
return !is_numeric(key($array));

}

}

?>


Usage:



$json = new json;
$encoded = $json->encode($var);
echo $encoded;

I will try to keep this thread updated with any future versions, but failing that, any updates will be on my website (link in sig).

mindlessLemming
02-20-2006, 01:45 AM
Here's a PEAR class that does JSON encoding and decoding:
http://mike.teczno.com/JSON/JSON.phps (don't worry, it only has one dependancy PEAR::UNIT; and that is only needed for testing purposes :))

Here's its main page:
http://pear.php.net/pepr/pepr-proposal-show.php?id=198

And here's its Yahoo Group:
http://groups.yahoo.com/group/json-php/

The reason the PHP extension version is preffered is because it is 85 times faster. If you're using a shorthand object notation, you're probably after every bit of speed you can wrangle.

For anyone interested, here's a link to the the PHP-JSON extension:
http://www.aurore.net/projects/php-json/
and here is the original published definition of the format: http://www.ietf.org/internet-drafts/draft-crockford-jsonorg-json-03.txt
..and here's the human readable version ;) http://www.json.org/

There is also a chance the PHP-JSON extension will be rolled into the PHP core! ('http://marc.theaimsgroup.com/?l=php-dev&m=113778553010014&w=2').

Jak-S
02-20-2006, 10:11 AM
Yeah, i did mention the two extensions on my site, Iíve no doubt that they are a better choice, but at least this provides an option for people who donít have control over whatís installed their servers (eg in a shared hosting environment).

If the PHP-JSON extension is bundled into PHP then that will be great, but until then at least this might help some people out.

mindlessLemming
02-22-2006, 08:09 AM
You missed my point. The PEAR class is not an extension.

Jak-S
02-22-2006, 08:27 PM
Oh, didnt realise that, jesus, that would have saved me some time. The reason i wrote the class was because i couldnt find any other one, damn :( . Oh well, people should use that one then. Least i got in some more coding practice.



EZ Archive Ads Plugin for vBulletin Copyright 2006 Computer Help Forum