json_encode在设计api时需要注意的问题
1. 在设计api时我们经常会使用关联数组,例如:我要返回给客户端主题信息和主题包列表
原始数组格式
$arr = array(
100=>array('themeName'=>'a','files'=>array('1.jpg','2.jpg')),
200=>array('themeName'=>'b','files'=>array('1.jpg','2.jpg')),
300=>array('themeName'=>'c','files'=>array('1.jpg','2.jpg')),
);
我们希望返回给客户端这样的数据
[
{'themeName'=>'a', files:[1.rar,2.rar]},
{'themeName'=>'b', files:[1.rar,2.rar]},
{'themeName'=>'c', files:[1.rar,2.rar]},
]
而json_encode给我们的是这样的数据
{
'100'=>{'themeName'=>'a', files:[1.rar,2.rar]},
'200'=>{'themeName'=>'b', files:[1.rar,2.rar]},
'300'=>{'themeName'=>'c', files:[1.rar,2.rar]},
}
在php中的数字索引数组对应js的[],关联数组对应js的{},看两个示例
php数值索引数组
$arr = array(1,2,3);
echo json_encode($arr);
output
[1,2,3]
php关联数组
$arr = array(1=>array(1,2,3),2=>array(4,5,6),3=>array(7,8,9));
echo json_encode($arr);
output
{"1":[1,2,3],"2":[4,5,6],"3":[7,8,9]}
要解决这个问题需要把“关联数组”转换成“数字数组”,例如
$arr = array(
100=>array('themeName'=>'a','files'=>array('1.jpg','2.jpg')),
200=>array('themeName'=>'b','files'=>array('1.jpg','2.jpg')),
300=>array('themeName'=>'c','files'=>array('1.jpg','2.jpg')),
);
$arr = array_merge(array(),$arr);
echo json_encode($arr);
使用array_merge函数和空数组合并就可以转换成数组数组了,这种方法的好处是可以保留数组的原始顺序
output
[{"themeName":"a","files":["1.jpg","2.jpg"]},{"themeName":"b","files":["1.jpg","2.jpg"]},{"themeName":"c","files":["1.jpg","2.jpg"]}]
也可以使用shuffle把数组打乱,但这样会破坏数组的顺序,例如
$arr = array(
100=>array('themeName'=>'a','files'=>array('1.jpg','2.jpg')),
200=>array('themeName'=>'b','files'=>array('1.jpg','2.jpg')),
300=>array('themeName'=>'c','files'=>array('1.jpg','2.jpg')),
);
shuffle($arr);
echo json_encode($arr);
2. 截取字符中文字符时要注意的问题
如果json串中有乱码,解析json就会报错,用substr截取中文会出现乱码的情况,应尽量使用多字节截取函数mb_substr截取中文字符
json_encode在设计api时需要注意的问题的更多相关文章
- Web API核查表:设计、测试、发布API时需思考的43件事[转]
Web API核查表:设计.测试.发布API时需思考的43件事 当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...
- 如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全
原文:如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全 .NET 中提供了一些线程安全的类型,如 ConcurrentDictionary<TKey, TVa ...
- 好的框架需要好的 API 设计 —— API 设计的六个原则
说到框架设计,打心底都会觉得很大很宽泛,而 API 设计是框架设计中的重要组成部分.相比于有很多大佬都认可的面向对象的六大原则.23 种常见的设计模式来说,API 设计确实缺少行业公认的原则或者说设计 ...
- 14.app后端如何设计api
app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参 ...
- 微服务设计 - api版本控制
要描述了几种API版本控制的方法.用户可以查询原始的API,或者添加定制的头文件来接收特定的版本.如果应用程序收到一个重大修订,将URI修改为V2.在进行迭代改进时,将创建与更改日期相一致的端点,并允 ...
- flask插件系列之flask_restful设计API
前言 flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的 ...
- Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql
Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql 1. 图16.1:MySQL体系结构1 2. 16.7. 创建表create()虚拟函数:2 3. 16.8 ...
- API生命周期第二阶段——设计:如何设计API(基于swagger进行说明)
题外话 在新的项目中,推行了swagger用于对API的设计.以期待解决我们上篇博客中说到了一些现象,提升工作效率.那么,结合到当时和全项目组成员做培训,以及后续的给主要应用者做培训,以及当初自己接触 ...
- 设计 api, url 的原则
设计 api, url 的原则 做微信公众号的项目,账号体系使用微信的 openid.现在增加需求,要求适应 web 端--做成普通的 web 项目.然后 url 的变化:我想给现有的 url 加上 ...
随机推荐
- input标签添加上disable属性在移动端(ios)字体颜色及边框颜色不兼容的解决办法。
手机一些兼容性问题: 1.苹果手机输入框input:disabled显示模糊问题 input:disabled, input[disabled]{ color: #5c5c5c; -webkit-te ...
- RL78 定义常量变量在指定的地址方法
若想定义的常量地址在远端寻址,定义section段时 如定义MCU_INFOR段 则段名为MCU_INFOR_f 后缀需要添加f,近端寻址添加n. 程序中定义常量 需要使用#pragma 指 ...
- 17.3.13---socket网络套接字介绍--函数和数据类型
1----Socket类型 套接字格式:socket(family,type[,protocal])使用给定的地址族,套接字类型,协议编号(默认为0)来创建套接字 socket类型 描述 socket ...
- 03.pipeline实现项目自动编译docker镜像自动打包
https://jenkins.io/zh/doc/book/pipeline/ 官方教程,可以中文.Jenkinsfile就是把pipeline内容保存到文件,然后提交到svn等版本控制库中.安装b ...
- tensorflow(七)
一.模型托管工具 TensorFlow Serving TensorFlow Serving支持生产级的服务部署,允许用户快速搭建从模型训练到服务发布的工作流水线. 工作流水线主要由三部分构成 (1) ...
- 文件操作符|-e|-M|-s|-A|_|-r -w $filename|stat|localtime|&|>>|<<
TTY:终端是一种字符型设备,它有多种类型,通常使用tty 来简称各种类型的终端设备 #!/usr/bin/perl use strict; use warnings; print "exi ...
- [SDOI2015]道路修建(线段树)
题意:给定2行n列的四连通带权网格图,支持修改边权和查询第[l,r]列的最小生成树 题解:这是一道好题,要么SDOI2019中n=2的20pts怎么会“我抄我自己”?(当然NOIP2018“我抄我自己 ...
- 【网络流】Modular Production Line
[网络流]Modular Production Line 焦作上的一道,网络流24题中的原题.... https://nanti.jisuanke.com/t/31715 给出了1e5个点,但是因为最 ...
- CCS|ANSI|中华人民共和国标准化法|国标|ISO|IEC|Ieeexplore|
国家的标准的有效期,标龄是5年.强制性标准是是指为保障人体的健康.人身.财产安全的标准和法律.行政法规定强制执行的标准,如药品标准.食品卫生标准. CCS:分类法简写图 国际标准,比如美国国家标准AN ...
- 路由器协议----IGP、EGP、RIP、OSPF、BGP、MPLS
1.路由控制的定义 <br>1.1.IP地址与路由控制 file:///var/folders/pz/cy11_lpd5rqfs66s778032580000gn/T/51.html ...