PHP语言怎么把JSON字符串转为对象?
json_decode
PHP json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。
语法
mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
参数
json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据
assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。
depth: 整数类型的参数,它指定递归深度
options: 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。
PHP如何判断字符串是否标准JSON,有什么好办法?
直接用json_decode,反序列化字符串,如何出错就是非标准,不出错就是标准。具体错误,json_last_error会返回,0表示没问题,非0,则是有问题。
引言
在MYSQL 5.6及以下没有 JSON 这个字段类型的时候,我们还只能用字符串存储数组,对象,这些结构数据;甚至有直接将序列化的对象存库的,都是无奈之举。
编程中也时不时对接口进行json_encode / json_decode。那么如果所得的字符串不是标准的格式,有什么办法快速检测吗?
本文就来说一说。
学习时间
最快的办法,还是使用PHP内置的 json_decode 函数,对于此函数的参数和返回值,我们需要认真地分析。
该函数接受一个 JSON 编码的字符串并且把它转换为 PHP 变量。函数结构:
mixed json_decode( string $json[, bool $assoc = false[, int $depth = 512[, int $options = 0]]] )
除了第一个字符串类型的$json必填之外,其他都是选填。如果我们定制功能,需要后面的参数也指定。比如,解码的字符串解析为关联数组,那么就指定 $assoc = true。
考虑到兼容性的要求,$json 传入的字符串,必须是 UTF-8 编码格式。
我们试着编写一个助手函数,用于判断字符串是否标准的json格式:
function isJson($string) { json_decode($string); return (json_last_error() == JSON_ERROR_NONE); }
这个方法使用了2个函数,和1个常量。其中 json_decode 是对字符串解码暂且不说。json_last_error 函数,如果有返回值,则是 JSON 编码解码时最后发生的错误。
JSON_ERROR_NONE 是无错误,=0。该句判断没有错误则是标准格式,返回 true;否则返回 false。
深入学习
其实上面的代码对于 json 加解码过程中的错误判断还是比较粗糙的。有一位小哥不嫌繁琐,手动拼装了详细的错误处理函数,非常实用。
使用上述函数进行测试:
$json = '[{"user_id":13,"username":"stack"},{"user_id":14,"username":"over"}]'; $output = json_validate($json); print_r($output);
输出内容如下:
这是正常的情况,json 格式完全正确。我们再测试一个不是规范格式的字符串。
$json = '{background-color:yellow;color:#000;padding:10px;width:650px;}'; $output = json_validate($json); print_r($output);
输出错误信息:
Syntax error, malformed JSON.
万能的正则
跟字符串打交道,正则表达式几乎可以做一切你想要的结果。json 字符串也一样,据文档所说,使用正则表达式判断JSON格式,稳定有效,而且速度还很快。
下面这个正则表达式您拿小本本记好了,一模一样地抄下来用就可以了。
return !preg_match('/[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]/', preg_replace('/"(\\.|[^"\\\\])*"/', '', $json_string));
写在最后
如果考虑程序的可读性,和可维护性,使用 json_decode 函数的判断无疑更直观,大家也更熟悉。然而正则表达式所体现出的高效也是不容小觑的。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
2022年,开发独立EXE桌面应用程序,用什么语言、技术合适?
两款神级开发工具推荐给你,而且都不难学:
一、Delphi。所谓「聪明的程序员用delphi,真正的程序用C」!,如果是写工具,外挂,不需要任何其他的dll辅助运行,就它了!
二、PowerBuilder。这款是操作数据库编程的神器!你用的功能越多,需要在主目录文件夹下放的dll越多,一般情况下,只需要放10个左右的dll就够你正常使用了,如果你需要用一些冷门的功能,交易吧dll单独放个文件夹,把路径放到环境变量里,这样你的主程序就可以只编译成一个exe就行了。
如果你是花钱找人做东西,不是自己开发,考虑到以后的维护,建议还是抱微软大腿吧,直接用c#,.net form装起来,毕竟上面说的那两个开发工具会的人越来越少了,希望我的答案对你有帮助!
Delphi XE10.31以上版本,或同平台C++Builder。
可生成独立EXE文件,编译时不带调试信息,体积小。
1。如果要存储运行参数,可用INI文件格式,直接读写 节名,参数名
2。如有多个EXE相互配合传递数据的需求,可用进程消息。
3。可通过网络接口控件实现远程数据传递。
等等。
可繁可简,可咸可甜。
delphi 熟悉了,那么windows下夸张点说他领先半个世纪 . 但是学会工作多年可能大多拿个月薪一个w,想来现在前端程序员只写vue都能拿1.5w,工作两三年就能拿到. python 也可以打包exe,只是体积大界面又难搞. 同样的golang也可以,但是这些搞win界面程序,就好比玩delphi就是玩王者、和平这种,玩其他的就像玩俄罗斯方块. 排除这些那只有c#,可以打包单exe,毕竟宇宙第一ide,玩几下不用看教程,就看看帮助demo就能完成很多需求. 有人可能说electron,但是那玩意在个人理解里,比起python打包在都矬. 还会有人说vscode都做出来了,搞不来是水平问题. 是的,高手什么不行,pascal,c 直接写的多了去了. 调用winapi就好了,现在很多汇编也有ui环境. 同比微软你是不是不缺人也不缺高人. 很多人觉得看个例子几分钟打包一套html在里面觉得就会了,后台语言看个crud就感觉什么都会写了,结果折腾三五年后再看,倒觉得啥也不会了.