json的注意事项

原文摘自:http://www.cnblogs.com/xcxc/p/3729207.html

在PHP语言中使用JSON和将json还原成数组

PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。

一、json_encode()


1

2

3

4

<?php

$arr array (‘a‘=>1,‘b‘=>2,‘c‘=>3,‘d‘=>4,‘e‘=>5);

echo json_encode($arr);

?>

输出


1

{"a":1,"b":2,"c":3,"d":4,"e":5}

再看一个对象转换的例子:


1

2

3

4

5

6

$obj->body           = ‘another post‘;

$obj->id             = 21;

$obj->approved       = true;

$obj->favorite_count = 1;

$obj->status         = NULL;

echo json_encode($obj);

输出


1

2

3

4

5

6

7

8

9

10

11

{

   "body":"another post",

 

   "id":21,

 

   "approved":true,

 

   "favorite_count":1,

 

   "status":null

 }

由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。

二、索引数组和关联数组

PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。

由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。

比如,现在有一个索引数组


1

2

3

$arr = Array(‘one‘‘two‘‘three‘);

echo json_encode($arr);

输出


1

["one","two","three"]

如果将它改为关联数组:


1

2

3

$arr = Array(‘1‘=>‘one‘‘2‘=>‘two‘‘3‘=>‘three‘);

 

echo json_encode($arr);

输出变为


1

{"1":"one","2":"two","3":"three"}

注意,数据格式从"[]"(数组)变成了"{}"(对象)。

如果你需要将"索引数组"强制转化成"对象",可以这样写


1

json_encode( (object)$arr );

或者


1

json_encode ( $arr, JSON_FORCE_OBJECT );

 三、类(class)的转换

下面是一个PHP的类:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class Foo {

  const     ERROR_CODE = ‘404‘;

  public    $public_ex ‘this is public‘;

  private   $private_ex ‘this is private!‘;

  protected $protected_ex ‘this should be protected‘;

 

  public function getErrorCode() {

    return self::ERROR_CODE;

  }

}

现在,对这个类的实例进行json转换:


1

2

3

4

5

$foo new Foo;

$foo_json = json_encode($foo);

echo $foo_json;

输出结果是


1

{"public_ex":"this is public"}

可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。

四、json_decode()

该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:


1

2

3

4

5

$json ‘{"foo": 12345}‘;

 

$obj = json_decode($json);

print $obj->{‘foo‘}; // 12345

通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:


1

2

3

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

 

var_dump(json_decode($json));

结果就是生成一个PHP对象:


1

2

3

4

5

6

7

8

9

10

object(stdClass)#1 (5) {

  ["a"] => int(1)

  ["b"] => int(2)

  ["c"] => int(3)

  ["d"] => int(4)

  ["e"] => int(5)

}

如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:


1

2

3

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

  

 var_dump(json_decode($json,true));

结果就生成了一个关联数组:


1

2

3

4

5

6

7

8

9

10

array(5) {

   ["a"] => int(1)

   ["b"] => int(2)

   ["c"] => int(3)

   ["d"] => int(4)

   ["e"] => int(5)

}

五、json_decode()的常见错误

下面三种json写法都是错的,你能看出错在哪里吗?


1

2

3

4

5

$bad_json "{ ‘bar‘: ‘baz‘ }";

$bad_json ‘{ bar: "baz" }‘;

$bad_json ‘{ "bar": "baz", }‘;

对这三个字符串执行json_decode()都将返回null,并且报错。

第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的"名"(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。

另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。


1

var_dump(json_decode("Hello World")); //null

时间: 2024-09-29 11:06:38

json的注意事项的相关文章

js 实现动态key value(JSON字符串注意事项:key和value都要用双引号,官网指定用双引号)

1.JSON字符串注意事项:key和value都要用双引号,官网指定用双引号,如下: var mapStr='{"a":"a","b":"b"}'; var map=JSON.parse(mapStr); 如此通过拼接字符串,JSON解析获得KeyValue var str='a'; map[str];//输出a 2.也是通过拼接字符串方式获得keyvalue,使用eval方法解析成数组,注意是数组 var mapStr='[

D3.js以及通用JS(JavaScript)读取并解析服务器端JSON的注意事项

这个需求其实挺明确的,但是网上搜出来的教程都乱七八糟,觉得实在需要自己总结一下. D3.js目前已经被广泛使用在数据可视化领域,随着大数据的持续发展,这个框架估计会在今后更加流行(据说其作者Mike Bostock开始全职开发了,之前是负责纽约时报数据可视化的工程师,他本人也从纽约搬家到了旧金山--).按照这里的介绍:https://github.com/mbostock/d3/wiki/API-Reference,D3.js实际上有专门读取JSON数据的API,所以其实D3.js读服务器端发布

objective C, parse json时注意事项

例: dict为从API请求返回的json调用 NSJSONSerialization JSONObjectWithData:方法得到的NSDictionary实例. 当执行以下语句时linkString不一定为NSString类型,需要进一步判断,否则当调用NSString特有的函数时(例如 [linkString length])可能会crash. NSString *linkString = [dict objectForKey:@"Link"]; //此时要加以下判断代码确保得

【Java EE 学习第31天】【JavaScript基础增强】【Ajax基础】【Json基础】

一.JavaScript基础增强 1.弹窗 (1)使用window对象的showModelDialog方法和showModelessDialog方法分别可以弹出模式窗口和非模式窗口,但是只能在IE中使用,所以不推荐使用,最好使用open方法弹窗. (2)open方法. (3)open方法弹窗实例. Base.html文档: <!DOCTYPE html> <html> <head> <title>Base.html</title> <met

JSON代码书写规范

在AJAX实现前后台数据交互的时候,通常使用JSON的数据格式,对于JSON来说,有严格的代码规范,一旦格式出问题,就无法显示出相应效果,同时还不在控制台报错.那么JSON的书写有哪些规范. JSON是什么? 在前后台的交互中,通常要互相传递消息,那就需要一种两方面都能“听懂的语言”,数据格式这里就代表语言.JSON就是前后台中都能理解的一种“语言”. JSON的类型 JSON也有不同的组织形式,一种是JSON对象,一种为JSON数组.因此,在书写的代码当中,需要遵循基本的对象.数组的书写方式.

Unity中使用json序列化失败

问题 //为什么用json序列化这样没得问题 Dictionary<string, int> dic = new Dictionary<string, int>(); dic.Add("1", 1); string strJson = LitJson.JsonMapper.ToJson(dic); //这样有问题 Dictionary<int, int> dic2 = new Dictionary<int, int>(); dic2.Ad

Swifter.Json -- 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具。

Swifter.Json Github Wiki 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具. Swifter.Json 已经经过了大量测试和线上项目中运行许久来确保它的稳定性. 特性 1: 支持 .Net 上绝大多是的数据类型,且轻松扩展:包括但不限于:实体,字典,集合,迭代器,数据读取器和表格. 2: 支持 .Net 我已知的大多数平台,包括但不限于:.Net Framework 2.0+, .Net Core 2.0+, .Net St

Windows系统下nodejs安装及配置

关于nodejs中文站,眼下活跃度最好的知识站应该是http://www.cnodejs.org/ ,而http://cnodejs.org/则活跃度较低.Express.js是nodejs的一个MVC开发框架,而且支持jade等多种模板,是Node.js上最流行的Web开发框架.这几天刚接触PhoneGap,曾经也看了一些nodejs的基础但苦于时间有限一直没机会亲自搭建一个nodejs环境,今天周末,部署了PhoneGap到Android,顺便一同搭建了一下nodejs本地环境,自己的操作过

json格式转数组注意事项

今天遇到一个特别奇葩的问题,json格式明明是正确的,转数组时却就是出不来,后来才发现是文件的编码问题,文件的编码一定要是utf-8无BOM格式,这点一定要切记!切记! 如果想确认json是否正确:http://www.kjson.com/ json格式的城市: <?php $json = '{ "北京": { "key": 11, "defaultvalue": 1, "values": { "东城区&quo