Получить ошибку, когда строка json_decode из сообщения ajax

Я пытаюсь отправить строку на контроллер, строка имеет формат json, при отправке на контроллер я получаю сообщение об ошибке и не могу декодировать свою строку json в этом контроллере. Я пытаюсь сначала закодировать в своем контроллере, но все равно получаю ошибку. И ошибка

"json_decode() expects parameter 1 to be string, array given", exception: "ErrorException",

здесь, в моей строке json

"{ "data" : 
[{
"id": "TNI01",
 "jenis_bayar": "TUNAI",
"no_kartu": "kosong",
"nominal": "10000",
"seq": "1"
} , 
{
"id": "DEB01",
"jenis_bayar": "DEBIT BCA",
"no_kartu": "786382432432",
"nominal": "20000",
"seq": "2"
}]
}"

здесь контроллер

public function ArrayPostToTablePembayaran(Request $request)
    {

       $data = json_decode($request->datajson, true);

       foreach ($data->data as $datas) 
       {
          $id         = $datas->id;
          $jenisbayar = $datas->jenis_bayar;
          $nokartu    = "";

          if ($datas->no_kartu == "kosong")
          {
              $nokartu  = "";
          }

          $nominal    = $datas->nominal;
          $seq        = $data->seq;
          $this->PosToTablePembayaran1($id , $jenisbayar , $nokartu , $nominal , $seq); 
       }
    }

и здесь скрипт ajax для разбора строки json на контроллер

function PembayaranKeDatabase1(arraystring)
            {
              $.ajax(
                  {
                      type    : "POST",
                      url     : "{{ url('/trx_bayar') }}",
                      data    : { datajson : JSON.parse(arraydata) } ,
                      dataType: "json",
                      success: function(data){

                      },
                      error: function() {

                      }
                  });
            }

спасибо перед

Итак, что непонятно? Вы передаете множество вместо строки. $request->datajson уже является массивом, и вам не нужно его декодировать.

u_mulder 12.05.2019 15:37

Итак, я думаю, передать объект json контроллеру? если строка уже должна быть объектом массива, как это сделать в foreach?

halococ 12.05.2019 15:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
229
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема в вашем коде, который вы пытаетесь декодировать json дважды: в клиентском js-коде и на сервере.

Давайте проверим, что вы делаете:

Я полагаю, функция JS PembayaranKeDatabase1(arraystring) имеет аргумент типа нить. Я также предполагаю, что arraystring — это JSON-строка. Итак, вы декодировать JSON-строку для объекта с

JSON.parse(arraydata)  
// btw shouldn't it be 
//JSON.parse(arraystring)

Итак, здесь вы отправляете на сервер простой объект, нет json.

Затем на сервере вы снова пытаетесь выполнить декодировать. Но вы получаете массив в $request->datajson, так как json уже декодирован на стороне клиента.

Итак, вы можете выбрать один из двух вариантов:

  1. Удалить JSON.parse:

    data    : { datajson : arraydata },
    

и используйте json_decode на сервере.

  1. Удалить json_decode($request->datajson, true) на сервере. Перебирайте ваши данные как

    // as $request->datajson is an array
    foreach ($request->datajson['data'] as $datas) {
        // use [] notation as you work with array, not object
        echo $datas['id'];
    }
    

если я выберу первый вариант, будет ли сценарий foreach, который я использовал раньше, правильным?

halococ 12.05.2019 15:52

Правильно, но опция true в json_decode декодирует данные в множество, и вам понадобится нотация [] вместо ->. Если вам все еще нужны объект и -> - удалите второй аргумент json_decode.

u_mulder 12.05.2019 15:54

Я думаю, что если я использую формат json, я должен декодировать в контроллере/сервере, но это уже будет формат массива, спасибо,

halococ 12.05.2019 16:04

Другие вопросы по теме