PHP 7.2 json_decode () - PullRequest
       57

PHP 7.2 json_decode ()

0 голосов
/ 27 ноября 2018

У меня есть эта строка, которая работала с json_decode () с PHP 5.6 , но не работает с PHP 7.2 ?

$json = '
{
  "text": "Hi {{fname}} 
   Welcome to our customer support. 
   Please select language to proceed",
  "buttons": [
    {
      "text": "English",
      "value": "language_english",
      "type": "postback"
    },
    {
      "text": "Germany",
      "value": "language_germany",
      "type": "postback"
    }
  ]
}';

Я попытался заменить пробелы и символ новой строки следующим образом

$json = preg_replace("/\n/m", '\n', $json);
$what   = "\\x00-\\x19"; // all whitespace characters except space itself
$json = trim(preg_replace( "/[".$what."]+/" , '' , $json));

В результате получается строка типа

\n{\n  "text": "Hi {{fname}} \n   Welcome to our customer support. \n   Please select language to proceed",\n  "buttons": [\n    {\n      "text": "English",\n      "value": "language_english",\n      "type": "postback"\n    },\n    {\n      "text": "Germany",\n      "value": "language_germany",\n      "type": "postback"\n    }\n  ]\n}

Обратите внимание на \n между и снаружи двойными кавычками, которыеделает его недействительным json, и, следовательно, json_decode не будет работать в этом случае.

Кто-нибудь знает способ добиться этого?

Спасибо.

1 Ответ

0 голосов
/ 27 ноября 2018
{
    "text": "Hi {{fname}} \n Welcome to our customer support. \n Please select language to proceed",
    "buttons": [{
            "text": "English",
            "value": "language_english",
            "type": "postback"
        },
        {
            "text": "Germany",
            "value": "language_germany",
            "type": "postback"
        }
    ]
}

Это действительный JSON.я добавил разрывы строк, чтобы вы могли использовать их, если хотите распечатать сообщения в браузере.

Вы можете использовать этот замечательный инструмент для проверки вашего json, когда у вас есть сомнения.

Редактирование моего ответа на основе комментариев комментария.

Прежде всего, вы должны выяснить, почему у вас сломан json в базе данных.Если это не на вас, и вы должны исправить это в php, то решение может быть таким:

<?php
echo '<pre>';
$data = '
{
  "text": "Hi {{fname}} 
   Welcome to our customer support. 
   Please select language to proceed",
  "buttons": [
    {
      "text": "English",
      "value": "language_english",
      "type": "postback"
    },
    {
      "text": "Germany",
      "value": "language_germany",
      "type": "postback"
    }
  ]
}';


        if (strstr($data, "\n")) {
            $data = trim(preg_replace('/\s\s+/', '  ', $data));
        }

        echo $data;

Выше код захватит разрывы строк вашего текстового поля и заменит их на DOUBLE пробел.Затем вы получите действительный json, такой как:

{
"text": "Hi {{fname}}  Welcome to our customer support.  Please select language to proceed",
"buttons": [
{
"text": "English",
"value": "language_english",
"type": "postback"
},
{
"text": "Germany",
"value": "language_germany",
"type": "postback"
}
]
}

Что вы можете сделать, если вам нужны разрывы строк, это то, что вы декодируете свой json (так же, как вы хотите, и замените двойной интервал в поле text наразрыв строки

...