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时需要注意的问题的更多相关文章

  1. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

  2. 如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全

    原文:如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全 .NET 中提供了一些线程安全的类型,如 ConcurrentDictionary<TKey, TVa ...

  3. 好的框架需要好的 API 设计 —— API 设计的六个原则

    说到框架设计,打心底都会觉得很大很宽泛,而 API 设计是框架设计中的重要组成部分.相比于有很多大佬都认可的面向对象的六大原则.23 种常见的设计模式来说,API 设计确实缺少行业公认的原则或者说设计 ...

  4. 14.app后端如何设计api

    app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参 ...

  5. 微服务设计 - api版本控制

    要描述了几种API版本控制的方法.用户可以查询原始的API,或者添加定制的头文件来接收特定的版本.如果应用程序收到一个重大修订,将URI修改为V2.在进行迭代改进时,将创建与更改日期相一致的端点,并允 ...

  6. flask插件系列之flask_restful设计API

    前言 flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的 ...

  7. Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql

    Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql 1. 图16.1:MySQL体系结构1 2. 16.7. 创建表create()虚拟函数:2 3. 16.8 ...

  8. API生命周期第二阶段——设计:如何设计API(基于swagger进行说明)

    题外话 在新的项目中,推行了swagger用于对API的设计.以期待解决我们上篇博客中说到了一些现象,提升工作效率.那么,结合到当时和全项目组成员做培训,以及后续的给主要应用者做培训,以及当初自己接触 ...

  9. 设计 api, url 的原则

    设计 api, url 的原则 做微信公众号的项目,账号体系使用微信的 openid.现在增加需求,要求适应 web 端--做成普通的 web 项目.然后 url 的变化:我想给现有的 url 加上 ...

随机推荐

  1. istio介绍

    核心架构 解决的问题 故障排查 1.  这个请求在哪里失败了?A有调用B吗? 2.  为什么用户的请求/页面hung住了? 3.  为什么系统这么慢?那个组件最慢? 应用容错性 1.  客户端没有配置 ...

  2. HTTP编码

    HTTP编码 不仅仅URL需要编码,HTTP header也需要编码,HTTP body 无特殊要求 一般采用百分号编码:比如一个字节的ascii码值是 0x89 那使用百分号编码之后 输出是 %89 ...

  3. XEN 3166

    XEN 3166 这题原题是spj,校oj上只用判断yes no,不过也差不多 题意分析之后就是求两个东西: 字典序最小的长度为m的子序列 同时这个字典序严格大于某个字符串 用序列自动机 先尽量相同, ...

  4. iOS之input file调用相册控制器消失跳转到登陆页

    最近在做一个app要用到H5,其中有一个需求是要点击H5的的控件弹出系统相册,通过在H5的input file 中定义<input type="file" class=&qu ...

  5. The website is API(1)

    Requests 自动爬取HTML页面 自动网路请求提交 robots 网络爬虫排除标准 Beautiful Soup 解析HTML页面 实战 Re 正则表达式详解提取页面关键信息 Scrapy*框架 ...

  6. IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像

    搭建 Qtopia2.2.0 开发环境,需要先搭建 Android 的编译环境,然后在 Android 编译环境的基础上,再搭建 Qtopia2.2.0 编译环境.以下内容基于迅为-iMX6开发板.Q ...

  7. 熊海CMS_1.0 代码审计

    熊海是一款小型的内容管理系统,1.0版本是多年前的版本了,所以漏洞还是比较多的,而且审计起来难度不大,非常适合入门,所以今天我进行这款cms的代码审计.程序安装后使用seay源代码审计系统打开,首先使 ...

  8. 关于va_list实例

    printf函数: #include <stdio.h> #include <stdarg.h> int myself_printf(char *format, ...) { ...

  9. mysql数据库常用命令入门

    查询所有数据库 show databases; 创建数据库 create database mytest001 default character set utf8; 查看数据库的默认字符集 show ...

  10. Linux启动初始化配置文件浅析

    转自:http://blog.51cto.com/19055/1144600 1)/etc/profile   登录时,会执行. 全局(公有)配置,不管是哪个用户,登录时都会读取该文件. (2)/ec ...