与安卓对接需要注意那些呢

在与安卓对接时,接口明明做判断了打印数据返回值也是json数据,但是每天第一次打开该接口时会出现报错情况,导致app崩溃,安卓打印该接口时是空,说明返回值 要么为空或者不是json数据,再就是结构变了,该怎么避免这种情况呢,现在也不清除问题出现在哪,如果通过api访问每次都有数据而且也正确,希望各位大佬帮忙看下

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
xianyunyehe
最佳答案

跟安卓对接的时候,json 格式特别要注意 就是因为PHP 不区分数组和字典的,所以对于一个PHP的数组 在encode的时候,可能返回的是字典 也可能是数组。这样会引起app类型不匹配导致崩溃。 举个例子

1. 字典和数组返回不匹配

$arr = ["id"=>1,"name"=>"33"];
echo json_encode($arr);

上面的结构 正常情况下是输出一个字典对象,{"id":1,"name":"33"} app 期望的就是这种结构。
但是有一天突然你可能查的记录不存在。数据就是空的了。

$arr = [];
echo json_encode($arr);

上面的结果就是 [] 返回的是一个数组了。app解析不了这个结构,就会崩溃。通常会返回前判断

if (empty($arr)) {
   $arr = (object) null;
}
echo json_encode($arr);

上面就正常返回一个{} 空对象,而不是空数组。

2. 数据类型不匹配

APP使用的是强类型语言,所以对于类型都是指定的。接口返回的数据类型也要固定,不然也会引起app崩溃
最常见的,大家在查数据库的时候,有的数据没默认值 就是null 但是输出的时候没格式化,直接返回了。app解析就出错,所以需要在输出的时候,对每个字段进行必要的类型转换。


$arr = ["id"=>"1","name"=>null];
$data = [
 "id"=>(int) $arr["id"],
"name"=>(string) $arr["name"],
];
echo json_encode($data);
4年前 评论
讨论数量: 9
xianyunyehe

跟安卓对接的时候,json 格式特别要注意 就是因为PHP 不区分数组和字典的,所以对于一个PHP的数组 在encode的时候,可能返回的是字典 也可能是数组。这样会引起app类型不匹配导致崩溃。 举个例子

1. 字典和数组返回不匹配

$arr = ["id"=>1,"name"=>"33"];
echo json_encode($arr);

上面的结构 正常情况下是输出一个字典对象,{"id":1,"name":"33"} app 期望的就是这种结构。
但是有一天突然你可能查的记录不存在。数据就是空的了。

$arr = [];
echo json_encode($arr);

上面的结果就是 [] 返回的是一个数组了。app解析不了这个结构,就会崩溃。通常会返回前判断

if (empty($arr)) {
   $arr = (object) null;
}
echo json_encode($arr);

上面就正常返回一个{} 空对象,而不是空数组。

2. 数据类型不匹配

APP使用的是强类型语言,所以对于类型都是指定的。接口返回的数据类型也要固定,不然也会引起app崩溃
最常见的,大家在查数据库的时候,有的数据没默认值 就是null 但是输出的时候没格式化,直接返回了。app解析就出错,所以需要在输出的时候,对每个字段进行必要的类型转换。


$arr = ["id"=>"1","name"=>null];
$data = [
 "id"=>(int) $arr["id"],
"name"=>(string) $arr["name"],
];
echo json_encode($data);
4年前 评论
xianyunyehe

跟安卓对接的时候,json 格式特别要注意 就是因为PHP 不区分数组和字典的,所以对于一个PHP的数组 在encode的时候,可能返回的是字典 也可能是数组。这样会引起app类型不匹配导致崩溃。 举个例子

1. 字典和数组返回不匹配

$arr = ["id"=>1,"name"=>"33"];
echo json_encode($arr);

上面的结构 正常情况下是输出一个字典对象,{"id":1,"name":"33"} app 期望的就是这种结构。
但是有一天突然你可能查的记录不存在。数据就是空的了。

$arr = [];
echo json_encode($arr);

上面的结果就是 [] 返回的是一个数组了。app解析不了这个结构,就会崩溃。通常会返回前判断

if (empty($arr)) {
   $arr = (object) null;
}
echo json_encode($arr);

上面就正常返回一个{} 空对象,而不是空数组。

2. 数据类型不匹配

APP使用的是强类型语言,所以对于类型都是指定的。接口返回的数据类型也要固定,不然也会引起app崩溃
最常见的,大家在查数据库的时候,有的数据没默认值 就是null 但是输出的时候没格式化,直接返回了。app解析就出错,所以需要在输出的时候,对每个字段进行必要的类型转换。


$arr = ["id"=>"1","name"=>null];
$data = [
 "id"=>(int) $arr["id"],
"name"=>(string) $arr["name"],
];
echo json_encode($data);
4年前 评论

json_encode($result ,JSON_FORCE_OBJECT),返回格式为{},设置好header为json,应该就可以了

4年前 评论

用户app请求你接口,每天第一次请求都会报错?是什么级别的错误?日志记录了吗?

4年前 评论

@fivenull 安卓那边捕捉到返回的数据不是json数据,他取数据的结构不对,是空指针

4年前 评论

引用二楼的回复,当后端查出的数据为 null 时,除了使用类型强转的方法外,也可以使用 stdClass 类(PHP5+),像下面这样:

<?php

$arr = null;
if (empty($arr)) {
    $arr = new stdClass;
}

echo json_encode($arr);
4年前 评论

猜测是不是日志权限问题, 导致应用报错

4年前 评论

很纠结,持续了好几天,还是遇到老问题

4年前 评论

现在已经有了一个新办法:
1、封装统一返回方法
2、对返回的内容进行整理,设定好返回的类型,并且,注意数据为空、数据错误时的返回

4年前 评论
Complicated

不要返回关联数组,安卓那边解不开,要返回正常数组就是[0=>object,1=>object,2=>object]这样的

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!