app前端处理PHP空对象为[]问题
众所周知,PHP是一门非弱类型的语言,空对象转成json的时候会默认转为[],
这让强类型语言,比如JAVA就很受伤,原本定义的一个对象,为空的时候居然传来一个空数组。
php大佬又惹不起,只能自己想办法了。
解决方案
只要我们针对服务返回的数据做个简单的正则过滤就可以了,代码也比较简单,下面是Dart版本的代码:
String _handleBracketByPhp(String source, String pre) {
RegExp exp = new RegExp(pre);
var sb = StringBuffer();
var index = 0;
for (var o in exp.allMatches(source)) {
sb.write(source.substring(index, o.start));
index = o.end;
}
sb.write(source.substring(index, source.length));
return sb.toString();
}
调用方法很简单:
response.data = _handleBracketByPhp(
_handleBracketByPhp(
response.data.toString(), r',"[a-zA-Z0-9_]+?":\[]'),
r'"[a-zA-Z0-9_]+?":\[],');
}
以下是JAVA版本的代码原理相同:
private String formatStringForPHP(String origin) {
String preRegEx = ",\"[a-zA-Z0-9_]+?\":\\[]";
String tailRegEx = "\"[a-zA-Z0-9_]+?\":\\[],";
Pattern r_pre = Pattern.compile(preRegEx);
Matcher m_pre = r_pre.matcher(origin);
m_pre.reset();
StringBuffer sb = new StringBuffer();
while (m_pre.find()) {
m_pre.appendReplacement(sb, "");
}
m_pre.appendTail(sb);
Pattern pattern = Pattern.compile(tailRegEx);
Matcher matcher = pattern.matcher(sb.toString());
matcher.reset();
StringBuffer sbNew = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sbNew, "");
}
matcher.appendTail(sbNew);
return sbNew.toString();
}
以上,我的第一篇blog。