php操作json

什么是JSON

  • 1 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
  • 2 很容易的进行阅读和编写。
  • 3 方便了机器进行解析和生成。
  • 4 采用完全独立于程序语言的文本格式。

JSON基于两种结构

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构。

对象:

对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构。

数组:

数组在js中是中括号“[]”括起来的内容,数据结构为["java","javascript","php",...]。

“名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)

值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)

体现形式

对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

数组(array) 是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

值(value) 可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

字符串(string) 是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

JSON的数值没有使用八进制与十六进制格式。

可以在任意标记之间添加空白。

PHP对变量进行 JSON 编码

函数:json_encode()

普通方式:

$arr = [
    'a' => 1,
    'b' => 2,
    'c' => 3,
    'd' => 4,
    'e' => 5
];
echo json_encode($arr);

对象转json:

$obj = new StdClass();
$obj->body = 'another post';
$obj->id = 21;
$obj->approved = true;
$obj->favorite_count = 1;
$obj->status = null;
echo json_encode($obj);
// {"body":"another post","id":21,"approved":true,"favorite_count":1,"status":null}

数组转对象:

PHP 5.3.3 +

$arr = [
    1,
    2,
    3
];
echo json_encode($arr);
// [1,2,3]
echo json_encode((object)$arr);
// {"0":1,"1":2,"2":3}
echo json_encode($arr, JSON_FORCE_OBJECT);
// {"0":1,"1":2,"2":3}

输出中文JSON:

以字面编码多字节 Unicode 字符(默认是编码成 \uXXXX)。 PHP 5.4.0 +

$arr = [
    '张三',
    '李四',
    '王五'
];
echo json_encode($arr);
// ["\u5f20\u4e09","\u674e\u56db","\u738b\u4e94"]
echo json_encode($arr, JSON_UNESCAPED_UNICODE);
// ["张三","李四","王五"]

输出中文JSON对象

//中文,json对象
$arr = [
    '张三',
    '李四',
    '王五'
];
echo json_encode($arr);
// ["\u5f20\u4e09","\u674e\u56db","\u738b\u4e94"]
echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
// {"0":"张三","1":"李四","2":"王五"}

浮点值类型保持:

$arr = [
    12.3,
    99.99,
    100.0
];
echo json_encode($arr);
// [12.3,99.99,100]
echo json_encode($arr, JSON_PRESERVE_ZERO_FRACTION);
// [12.3,99.99,100.0]

其他的掩码:

JSON_HEX_TAG (integer)
所有的 < 和 > 转换成 \u003C 和 \u003E。  PHP 5.3.0 +
JSON_HEX_AMP (integer)
所有的 & 转换成 \u0026。 PHP 5.3.0 +
JSON_HEX_APOS (integer)
所有的 ' 转换成 \u0027。 PHP 5.3.0 +
JSON_HEX_QUOT (integer)
所有的 " 转换成 \u0022。 PHP 5.3.0 +
JSON_NUMERIC_CHECK (integer)
将所有数字字符串编码成数字(numbers)。 PHP 5.3.3 +
...

服务端代码

输出JSON到JavaScript程序;

header('Content-type:text/json');  
或者
header('content-type:application/json;charset=utf8');    

服务端设置 header 头允许AJAX跨域:

header('Content-Type: text/javascript; charset=utf8');
//如果需要设置允许所有域名发起的跨域请求,可以使用通配符 *
header('Access-Control-Allow-Origin: http://www.test.com/');
//表明该响应的有效时间为 86400 秒,也就是 24 小时。
header('Access-Control-Max-Age: 86400 ');
//服务器允许客户端使用指定方法发起请求
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');

JSON验证:

function isValidJson($strJson) { 
    json_decode($strJson); 
    return (json_last_error() === JSON_ERROR_NONE); 
} 

json解码:

函数:json_decode()

解码json:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

//解码json
var_dump(json_decode($json));
/*
object(stdClass)[1]
  public 'a' => int 1
  public 'b' => int 2
  public 'c' => int 3
  public 'd' => int 4
  public 'e' => int 5
*/

解码为数组:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

//转成数组
var_dump(json_decode($json, true));
/*
array (size=5)
  'a' => int 1
  'b' => int 2
  'c' => int 3
  'd' => int 4
  'e' => int 5
 */

大整型数值:

JSON_BIGINT_AS_STRING, 用于将大整数转为字符串而非默认的float类型。

$json = '{"number": 12345678901234567890}';
print_r(json_decode($json));
/*
 stdClass Object
(
    [number] => 1.2345678901235E+19
)
 */

print_r(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));
/*
stdClass Object
(
    [number] => 12345678901234567890
)
 */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Javascript 中可以用{}表示一个对象,用[]表示一个数组,如: var obj={"a":"v","b"...
    旅行家John阅读 1,943评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 1. 翻看了日历,后天就是2017年全国考研大军进考场见分晓的时候了。想起了几年前的自己,那一刻也是满怀期待与忐忑...
    啦啦小巫阅读 875评论 2 12
  • 每个人都渴望成功,作为年轻的我,当然也不例外。 朋友圈的人都说我有野心,我也不知道这算是在夸我还是损我,暂时就理解...
    奇艺果阅读 1,104评论 0 1