如何在PHP中解析json

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PHP中解析json相关的知识,希望对你有一定的参考价值。

目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。
从5.2版本开始,php原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。
一、json_encode()
该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:
  $arr = array (\'a\'=>1,\'b\'=>2,\'c\'=>3,\'d\'=>4,\'e\'=>5);
  echo json_encode($arr);

结果为
"a":1,"b":2,"c":3,"d":4,"e":5

由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。

二、索引数组和关联数组
PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。
由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。
比如,现在有一个索引数组
  $arr = Array(\'one\', \'two\', \'three\');
  echo json_encode($arr);

结果为:

["one","two","three"]

三、类(class)的转换
下面是一个PHP的类:   class Foo     const ERROR_CODE = \'404\';     public $public_ex = \'this is public\';     private $private_ex = \'this is private!\';     protected $protected_ex = \'this should be protected\';     public function getErrorCode()       return self::ERROR_CODE;        
现在,对这个类的实例进行json转换:

  $foo = new Foo;
  $foo_json = json_encode($foo);
  echo $foo_json;

输出结果是
"public_ex":"this is public"

可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。
参考技术A json_decode($json_str, true);

如何在 PHP 中解析 base64_encode() 的 Json 结果

【中文标题】如何在 PHP 中解析 base64_encode() 的 Json 结果【英文标题】:How to parser Json result from base64_encode() in PHP 【发布时间】:2019-12-10 23:51:53 【问题描述】:

我编写了一个 php 脚本来使用 base64_decode() 函数解码一个值。我想将解析结果存储到不同的变量中。我该如何做到这一点??

 $str = 'eyJ0eXAiO0IjoiNTAwMCIsInZhbGlkaXR5IjoiMzAifQjdubnmGHANidodnd';
 $msisdn_64 = base64_decode($msisdn);
 print_r($msisdn_64);

注意:为了隐私起见,$str 变量包含虚拟值,而且这不使用令牌来解码

上面的代码输出:

"typ":"JWT","alg":"HS256""sub":"456564685455","service":"000","created":20010809,"account_name":"Acct" ,"iss":"Acft","exp":false,"amount":"000","validity":"30"�.'���A˕X=·&|�L�0� “����

我尝试了类似 $msisdn[1]->sub$msisdn[0]->sub$msisdn->sub 到第二个对象中的值,但它不起作用。请帮忙

【问题讨论】:

问题是它实际上是一个base64编码的字符串......使用base64格式解码它并将其中的数据解析为不同的变量 $msisdn_64 不包含有效的 JSON。看起来不仅两个或多个 JSON 对象被混合在一起,而且还有尾随的二进制垃圾。没有开箱即用的方法可以正确解析。 所以我要解决这个问题 How to decode JWT using JWT-auth in laravel的可能重复 【参考方案1】:

可以使用json_decode函数

https://www.php.net/manual/en/function.json-decode.php

例子:

<?php
$json = '"a":1,"b":2,"c":3,"d":4,"e":5';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>

【讨论】:

请进行Base64解码.....指定的格式是使用JWT库的base64。 @Andre 然后使用 JWT 库来解析这个...?! 请推荐一个 这里不推荐第三方软件。 你从地狱中救了我的命 :)) 【参考方案2】:
$str = 'eyJ0eXAiO0IjoiNTAwMCIsInZhbGlkaXR5IjoiMzAifQjdubnmGHANidodnd';
$msisdn_64 = base64_decode($msisdn);
print_r($msisdn_64);

这里你需要像下面这样再次解码字符串。

$str = 'eyJ0eXAiO0IjoiNTAwMCIsInZhbGlkaXR5IjoiMzAifQjdubnmGHANidodnd';
$msisdn_64 = json_decode(base64_decode($msisdn),true);
print_r($msisdn_64);

记得将参数true放在json_decode()方法中,因为它以关联数组的形式返回结果。

【讨论】:

以上是关于如何在PHP中解析json的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 php 中解析这个 json 文件? [复制]

如何使用php解析json数组并显示?

如何在 PHP 中解析 base64_encode() 的 Json 结果

如何在json中编码php数组并解析成jquery

PHP解析JSON

如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?