从 json i laravel 获取数据时出现错误异常

Posted

技术标签:

【中文标题】从 json i laravel 获取数据时出现错误异常【英文标题】:Error Exception when get data from json i laravel 【发布时间】:2021-08-30 04:12:20 【问题描述】:

我正在尝试从互联网上找到的外部 API 读取数据,我在互联网上关注了几篇文章,但仍然存在如下错误,有谁知道我如何从JSON?

错误:

ErrorException #196 ▼
  #message: "Illegal string offset 'verses'"
  #code: 0
  #file: "C:\laragon\www\distrik24blog\storage\framework\views\e523d302202180142edce531702b14dc31954a07.php"
  #line: 42
  #severity: E_WARNING

控制器代码:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;
class alkitabcontroller extends Controller

    public function fetchInitialData()
        $client = new Client;
        $response = $client->get("https://api-alkitab.herokuapp.com/v2/passage/kejadiam/1?ver=tb");
        $json_string = $response->getBody()->getContents();
        $data = json_decode($json_string);
        return view('khotbahdanrenungan/alkitab', compact('data'));
    

    public function getDataAlkitab(Request $request)
        $kitab = $request->input('kitab');
        $pasal = $request->input('pasal');

        $client = new Client;
        $response = $client->get("https://api-alkitab.herokuapp.com/v2/passage/$kitab/$pasal?ver=tb");
        $json_string = $response->getBody()->getContents();
        $data = json_decode($json_string);
        return view('khotbahdanrenungan/alkitab', compact('data'));
    

网络:

Route::get('/alkitab','alkitabcontroller@fetchInitialData');
Route::post('/searchdata','alkitabcontroller@getDataAlkitab');

刀片代码:

<div class="col-md-9">
            <div class="card">
                <div class="card-body">
                    @foreach ($data as $item)
                    <label for="kitab"><span>Markus</span><span>24</span></label>
                    <p> $item['verses']['content']</p>
                    <hr>
                    @endforeach
                </div>
            </div>
        </div>

json 结构:


    "title": "Yohanes 1:1-51",
    "book_number": 43,
    "chapter": 1,
    "verses": [
        
            "verse": 1,
            "content": "Pada mulanya adalah Firman; Firman itu bersama-sama dengan Allah dan Firman itu adalah Allah."
        ,
        
            "verse": 2,
            "content": "Ia pada mulanya bersama-sama dengan Allah."
        ,

【问题讨论】:

【参考方案1】:

您是否考虑过转储变量以查看结构是如何真正定义的? dd($data)dd($item)(在 php 内)将显示变量及其内容。

如果我这样阅读您的代码,您的 json 结构是 $data 的转储,因此循环通过 $data 会为您提供每个单独的键,而键 title 没有名为 @987654328 的子键@。

然而,如果它存在的,你可以使用null coalesce来捕获它不存在的情况: $item['verses']['content'] ?? ''

【讨论】:

【参考方案2】:

由于$json_string 要返回json string,所以您需要将true 作为第二个参数传递给json_decode,否则返回object

 $client = new Client;
    $response = $client->get("https://api-alkitab.herokuapp.com/v2/passage/kejadiam/1?ver=tb");
    $json_string = $response->getBody()->getContents();
    echo "<pre>";
    print_r(json_decode($json_string, true));

这将返回数组

Array
(
    [title] => Amos 1:1-15
    [book_number] => 30
    [chapter] => 1
    [verses] => Array
        (
            [0] => Array
                (
                    [verse] => 1
                    [content] => Perkataan yang dinyatakan kepada Amos, salah seorang peternak domba dari Tekoa, tentang Israel pada zaman Uzia, raja Yehuda, dan dalam zaman Yerobeam, anak Yoas, raja Israel, dua tahun sebelum gempa bumi.
                )

            [1] => Array

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

json_decode ( 字符串 $json , bool|null $associative = null , int $depth = 512 , int $flags = 0 ) : 混合

$associative

当为 true 时,JSON 对象将作为关联数组返回;什么时候 false,JSON 对象将作为对象返回。为空时,JSON 对象将作为关联数组或对象返回,具体取决于 标志中是否设置了 JSON_OBJECT_AS_ARRAY。

更新

你的循环也需要改变

 @foreach ($data['verses'] as $item)
                    <label for="kitab"><span>Markus</span><span>24</span></label>
                    <p> $item['content']</p>
                    <hr>
                    @endforeach

如果你是json_decode($json_string) 那么

  @foreach ($data->verses as $item)
                        <label for="kitab"><span>Markus</span><span>24</span></label>
                        <p> $item['content']</p>
                        <hr>
                        @endforeach

【讨论】:

以上是关于从 json i laravel 获取数据时出现错误异常的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Guzzle 和 Laravel 从 JSON 响应中提取单个数组值

尝试将翻译键值的 json 从 laravel 刀片传递到 vue.js 时出现问题

如何在 laravel 中使用 foreach 从 json 文件中获取所有数据?

Laravel:从相关表中获取数据(json数组列)

尝试通过 JSON 查询从 openweathermap 获取数据时出现 FileNotFoundException

Laravel:尝试获取 PDF 时出现 DOMPDF 错误