Php 将JSON字符串转换为无JSON_解码的数组
我在共享服务器上使用PHP通过API访问外部站点,该API返回包含2级数据的JSON(1级:执行者&2级:执行者内部的类别数组)。我想在不使用json_解码函数的情况下将其转换为多维关联数组(它使用了太多内存!!!) JSON数据示例:Php 将JSON字符串转换为无JSON_解码的数组,php,arrays,json,preg-match-all,preg-split,Php,Arrays,Json,Preg Match All,Preg Split,我在共享服务器上使用PHP通过API访问外部站点,该API返回包含2级数据的JSON(1级:执行者&2级:执行者内部的类别数组)。我想在不使用json_解码函数的情况下将其转换为多维关联数组(它使用了太多内存!!!) JSON数据示例: [ { "performerId": 99999, "name": " Any performer name", "category": { "categoryId": 99, "name": "Some
[
{
"performerId": 99999,
"name": " Any performer name",
"category": {
"categoryId": 99,
"name": "Some category name",
"eventType": "Category Event"
},
"eventType": "Performer Event",
"url": "http://www.novalidsite.com/something/performerspage.html",
"priority": 0
},
{
"performerId": 88888,
"name": " Second performer name",
"category": {
"categoryId": 88,
"name": "Second Category name",
"eventType": "Category Event 2"
},
"eventType": "Performer Event 2",
"url": "http://www.novalidsite.com/somethingelse/performerspage2.html",
"priority": 7
}
]
我尝试使用substr并去掉“[”和“]”
然后执行调用:
preg_match_all('/\{([^}]+)\}/', $input, $matches);
这为我提供了每行的字符串,但在类别数据的尾部“}”之后截断
我如何使用preg_split、preg_match_all等来返回整行数据作为数组,而不是对整个json字符串进行json_decode之类的繁重调用
一旦正确识别了每一行的数组,我就可以对该字符串执行json_解码,而不会使共享服务器上的内存负担过重
对于那些希望了解导致错误的json_解码用法的详细信息的人:
$aryPerformersfile[ ] = file_get_contents('https://subdomain.domain.com/dir/getresults?id=1234');
$aryPerformers = $aryPerformersfile[0];
unset($aryPerformersfile);
$mytmpvar = json_decode($aryPerformers);
print_r($mytmpvar);
exit;
这里有两个选项,都不包括编写自己的解码器;不要用不必要的变通方法使解决方案过于复杂 1) 减小正在解码的json的大小,或 2) 增加服务器上允许的内存 第一个选项需要访问正在创建的json。这可能是也可能不是,取决于您是否是最初创建json的人。最简单的方法是
unset()
任何无用的数据。例如,可能有一些调试信息您不需要,所以您可以执行unset($json_array['debug'])代码>在无用的数据上。
第二个选项要求您能够访问服务器上的php.ini文件。您需要找到类似于memory\u limit=128M
的行,并将128M
部分放大。尝试将此值增加一倍,使文件中已有的值增加一倍(因此在本例中为256M)。但这可能无法解决您的问题,因为大型json数据仍然可能是问题的核心;这只为效率低下的代码提供了一个解决办法。这里有两个选项,都不包括编写自己的解码器;不要用不必要的变通方法使解决方案过于复杂
1) 减小正在解码的json的大小,或
2) 增加服务器上允许的内存
第一个选项需要访问正在创建的json。这可能是也可能不是,取决于您是否是最初创建json的人。最简单的方法是unset()
任何无用的数据。例如,可能有一些调试信息您不需要,所以您可以执行unset($json_array['debug'])代码>在无用的数据上。
第二个选项要求您能够访问服务器上的php.ini文件。您需要找到类似于memory\u limit=128M
的行,并将128M
部分放大。尝试将此值增加一倍,使文件中已有的值增加一倍(因此在本例中为256M)。但这可能无法解决您的问题,因为大型json数据仍然可能是问题的核心;这只为效率低下的代码提供了一个解决办法。这里有两个选项,都不包括编写自己的解码器;不要用不必要的变通方法使解决方案过于复杂
1) 减小正在解码的json的大小,或
2) 增加服务器上允许的内存
第一个选项需要访问正在创建的json。这可能是也可能不是,取决于您是否是最初创建json的人。最简单的方法是unset()
任何无用的数据。例如,可能有一些调试信息您不需要,所以您可以执行unset($json_array['debug'])代码>在无用的数据上。
第二个选项要求您能够访问服务器上的php.ini文件。您需要找到类似于memory\u limit=128M
的行,并将128M
部分放大。尝试将此值增加一倍,使文件中已有的值增加一倍(因此在本例中为256M)。但这可能无法解决您的问题,因为大型json数据仍然可能是问题的核心;这只为效率低下的代码提供了一个解决办法。这里有两个选项,都不包括编写自己的解码器;不要用不必要的变通方法使解决方案过于复杂
1) 减小正在解码的json的大小,或
2) 增加服务器上允许的内存
第一个选项需要访问正在创建的json。这可能是也可能不是,取决于您是否是最初创建json的人。最简单的方法是unset()
任何无用的数据。例如,可能有一些调试信息您不需要,所以您可以执行unset($json_array['debug'])代码>在无用的数据上。
第二个选项要求您能够访问服务器上的php.ini文件。您需要找到类似于memory\u limit=128M
的行,并将128M
部分放大。尝试将此值增加一倍,使文件中已有的值增加一倍(因此在本例中为256M)。但这可能无法解决您的问题,因为大型json数据仍然可能是问题的核心;这只能解决低效代码的问题。如果内存有限,可以将数据作为流读取并一次解析JSON,而不是一次解析所有内容
getresults.json:
[
{
"performerId": 99999,
"name": " Any performer name",
"category": {
"categoryId": 99,
"name": "Some category name",
"eventType": "Category Event"
},
"eventType": "Performer Event",
"url": "http://www.novalidsite.com/something/performerspage.html",
"priority": 0
},
{
"performerId": 88888,
"name": " Second performer name",
"category": {
"categoryId": 88,
"name": "Second Category name",
"eventType": "Category Event 2"
},
"eventType": "Performer Event 2",
"url": "http://www.novalidsite.com/somethingelse/performerspage2.html",
"priority": 7
}
]
PHP:
输出:
Performer with ID 99999 has category Some category name
Performer with ID 88888 has category Second Category name
考虑到字符串值本身可能包括{
和}
字符等,使用缓冲区进行更快的读取当然可以改进此代码。如果内存有限,可以
Performer with ID 99999 has category Some category name
Performer with ID 88888 has category Second Category name