【问题标题】:Error Exception when get data from json i laravel从 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."
        },

【问题讨论】:

    标签: php html json laravel web


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2017-03-31
        • 2013-01-30
        • 2022-09-24
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 1970-01-01
        • 2012-09-23
        相关资源
        最近更新 更多