我在Laravel中有一个应用程序,该应用程序从dB中获取大量数据并将其呈现为JSON。下面的代码行生成标题错误:
$decodedData['detail']['is_stem'] = isset($detailData->is_stem) ? $detailData->is_stem : 0;
错误是:不能使用带字符串偏移量的分配操作符
$ decodedData是一个较大的数组,最终以JSON返回。它是这样创建的:
$decodedData = json_decode($detailData->detail, true);
$ detailData是一个看起来像这样的对象:
App\CareersDetails Object
(
[connection:protected] => mysql
[table:protected] =>
[primaryKey:protected] => id
[keyType:protected] => int
[incrementing] => 1
[with:protected] => Array
(
)
[withCount:protected] => Array
(
)
[perPage:protected] => 15
[exists] => 1
[wasRecentlyCreated] =>
[attributes:protected] => Array
(
[id] => 4
[code] => 1234
[title] => StackOverFlow
[category] => My Category
[detail] => "Some details in JSON"
[is_stem] => 1
[created_at] => 2018-12-28 17:05:15
[updated_at] => 2018-12-28 17:05:15
)
[original:protected] => Array
(
[id] => 7
[code] => 7890
[title] => StackOverFlowRocks
[category] => My Category
[detail] => "Some details in JSON format"
[is_stem] => 1
[created_at] => 2018-12-28 17:05:15
[updated_at] => 2018-12-28 17:05:15
)
[changes:protected] => Array
(
)
[casts:protected] => Array
(
)
[dates:protected] => Array
(
)
[dateFormat:protected] =>
[appends:protected] => Array
(
)
[dispatchesEvents:protected] => Array
(
)
[observables:protected] => Array
(
)
[relations:protected] => Array
(
)
[touches:protected] => Array
(
)
[timestamps] => 1
[hidden:protected] => Array
(
)
[visible:protected] => Array
(
)
[fillable:protected] => Array
(
)
[guarded:protected] => Array
(
[0] => *
)
)
当我使用以下命令进行调试时:
print_r($detailData->is_stem);
系统输出1。因此已设置。
或者,我的$ decodedData数组是否出错?
更新
感谢评论,我注意到我的$ decodedData不是数组,而是一个字符串。
因此我放弃了
`$detailData->detail`
使用print_r进入我的浏览器页面,并通过一个简单的单独的PHP脚本运行它:
$payload = "JSON FROM $detailData->detail";
$data = json_decode($payload,true);
$data['detail']['is_stem'] = 1;
print_r($data );
这有效。因此,我的问题是现在为什么从print_r转储字符串并且我的Laravel基于应用程序不起作用?
或者换句话说,为什么json_decode在Laravel App中返回一个字符串,但在PHP app中返回一个具有相同输入的数组?
答案 0 :(得分:0)
我的问题是我的JSON数据是双重编码的。解决方法是:
$decodedData = json_decode(json_decode($detailData->detail), true);
请注意,这不是最佳做法,对我们来说是一个完全的监督,因此我们将尽快对此进行更改。