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 加上 ...
随机推荐
- anaconda学习笔记
anaconda介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. Conda是一个开源的包.环境管理器,可以用于在同一个机器上 ...
- C和C++的区别,有你不知道的
c和c++可以说现在都是比较流行的,但是两者到底有什么联系和区别吗,这是学习c和c++最需要注意的,不要把两者搞混了,我们先开始就来看一下c和c++有什么联系,这两者可以这样说:C++是C的超集,兼容 ...
- 吴裕雄--天生自然TensorFlow高层封装:解决ImportError: cannot import name 'tf_utils'
将原来版本的keras卸载了,再安装2.1.5版本的keras就可以了.
- maven多模块profiles的石使用
另外参考:https://blog.csdn.net/linhao19891124/article/details/73872303 maven中指定build一个project中几个特定的子modu ...
- NAIPC 2019 A - Piece of Cake(凸包计算)
学习:https://blog.csdn.net/qq_21334057/article/details/99550805 题意:从nn个点中选择kk个点构成多边形,问期望面积. 题解:如果能够确定两 ...
- P2486 [SDOI2011]染色 区间合并+树链剖分(加深对线段树的理解)
#include<bits/stdc++.h> using namespace std; ; struct node{ int l,r,cnt,lazy; node(,,,):l(l1), ...
- LGOJ2568 GCD
Description link 给定整数\(n\),\(1 \leq x,y \leq n\)且\(gcd(x,y)\)为质数的\((x,y)\)的对数 \[1\leq n\leq 10^7\] S ...
- 动态指定log4net日志文件名称
如果是希望日志文件按常见的日期格式动态命名,没什么好说的,直接修改app.config <param name="DatePattern" value="yyyyM ...
- mysql操作命令梳理-grant授权和revoke回收权限
在mysql维护工作中,做好权限管理是一个很重要的环节.下面对mysql权限操作进行梳理: mysql的权限命令是grant,权限撤销的命令时revoke:grant授权格式:grant 权限列表 o ...
- [LC] 149. Max Points on a Line
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...