json_decode JSON_ERROR_SYNTAX функциясын қайтарады, бірақ онлайн пішімдегіш JSON дұрыс

Менде өте қызықты мәселе болды.

Менде JSON веб-торабы бар.

When i check it with this website http://www.freeformatter.com/json-formatter.html#ad-output

Барлығы жақсы.

Бірақ мен JSON-ды осы кодпен жүктеген кезде:

  $data = file_get_contents('http://www.mywebservice');

if(!empty($data))
{

    $obj = json_decode($data);

 switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - JSON_ERROR_NONE';
    break;
    case JSON_ERROR_DEPTH:
        echo ' - JSON_ERROR_DEPTH';
    break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - JSON_ERROR_STATE_MISMATCH';
    break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' -  JSON_ERROR_CTRL_CHAR';
    break;
    case JSON_ERROR_SYNTAX:
        echo "\r\n\r\n - SYNTAX ERROR \r\n\r\n";
    break;
    case JSON_ERROR_UTF8:
        echo ' - JSON_ERROR_UTF8';
    break;
    default:
        echo ' - Unknown erro';
    break;
}

Қате алдым: SYNTAX ERROR

БАРЛЫҚ БАРЛЫҚҚА ЖАРДАМ БЕРІЛМЕЙДІ.

Бұл кошмар.

I see that with PHP 5.5 i could use this function : http://php.net/manual/en/function.json-last-error-msg.php

(бірақ PHP 5.5-ні орнатуға сәтім келмеді, мен бұл функция маған толық мәлімет беретініне сенімді емеспін)

25
JSON көрсетіңіз.
қосылды автор Niet the Dark Absol, көзі
Мүмкін сізге қате туралы хабарды көбірек түсіндіруге болады? Мысалы, JSON қате туралы хабарды қосыңыз ба?
қосылды автор Mr. Llama, көзі
JSON өтінеміз. Бізге JSON қажет.
қосылды автор vikingmaster, көзі

10 жауаптар

Мен сол мәселеге тап болдым, іс жүзінде көрінбейтін жасырын кейіпкерлер бар және оларды жою қажет. Көптеген жағдайларда жұмыс істейтін ғаламдық код:

<?php
$checkLogin = file_get_contents("http://yourwebsite.com/JsonData");

// This will remove unwanted characters.
// Check http://www.php.net/chr for details
for ($i = 0; $i <= 31; ++$i) { 
    $checkLogin = str_replace(chr($i), "", $checkLogin); 
}
$checkLogin = str_replace(chr(127), "", $checkLogin);

// This is the most common part
// Some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
// here we detect it and we remove it, basically it's the first 3 characters 
if (0 === strpos(bin2hex($checkLogin), 'efbbbf')) {
   $checkLogin = substr($checkLogin, 3);
}

$checkLogin = json_decode( $checkLogin );
print_r($checkLogin);
?>
60
қосылды
Тек бұл шешім маған көмектесті. рахмет
қосылды автор Marius Gentvilas, көзі
Құрметті мырза, сіз маған қаншалықты көмектесті десеңізші. Мен шешімді шешу үшін барлық жерде қарап, мен дерлік бас тарттым. Мырзалар, сен Құдайсың.
қосылды автор deepakgates, көзі
+1 үшін BOM, еске емес. @GeorgeOnofrei, бір жауаптылық принципі, егер бұл жолда жарамсыз таңбалар болса немесе бұл JSON құжатының өзі ішінара техникалық емес бөлік болса, бұл функцияның санитарлық жағдайын жасаудың мақсаты емес екенін айтады!
қосылды автор Benjamin, көзі
Неліктен бұл PHP 7.0.x нұсқасында неге жатпайды? (бет пальмасы)
қосылды автор George Onofrei, көзі
Бұл менің жағдайыма көмектесті ... for ($ i = 0; $ i <= 31; ++ $ i) {$ checkLogin = str_replace (chr ($ i), «», $ checkLogin); } Бірақ неге?
қосылды автор Tony Samperi, көзі
рахмет, менің күнімді құтқарасыз.
қосылды автор Jackson Tong, көзі
Microsoft-тың фракин серіктес орталығы api қайтарады BOM? Неліктен?
қосылды автор Captain Hypertext, көзі
сен менің кейіпкерімсің
қосылды автор JokerDev, көзі

BOM-ді жою (байттық тапсырыстың белгісі) жиі-жиі қажет шешім:

function removeBOM($data) {
    if (0 === strpos(bin2hex($data), 'efbbbf')) {
       return substr($data, 3);
    }
    return $data;
}

Сізде BOM болмауы керек, бірақ ол бар болса, ол көрінбейді, сондықтан оны көре алмайсыз!

see W3C on BOM's in HTML

BOM Cleaner файлын түзететін болса, пайдаланыңыз.

30
қосылды
UTF-8 -ден UTF-8-ден BOM кодының кодын Notepad ++ кодының жоғарғы мәзіріндегі Notepad ++> Format> UTF- 8 жоқ BOM
қосылды автор deadfish, көзі
Бұл жауапты таба алмай 1 миллионға жуық уақытты жоғалтып алды ... рахмет!
қосылды автор dmmd, көзі

Мен json_decode алдында жолға stripslashes қосу арқылы бұл мәселені шештік.

$data = stripslashes($data); 
$obj = json_decode($data);
19
қосылды
$ data = stripslashes ($ data) болмауы керек;
қосылды автор TarranJones, көзі
Пожалуйста, сіздің кодын пішімдеу. Рахмет.
қосылды автор JLILI Amen, көзі
Бұл жалғыз шешім маған көмектесті
қосылды автор Harsh, көзі

Барлық заттарды бір жерге жинау үшін, мен автоматты түрде түзету әрекеттерін декодтау арқылы JSON қаптамасын дайындадым. Ең соңғы нұсқаны менің GitHub Gist бөлімінен табуға болады.

abstract class Json
{
    public static function getLastError($asString = FALSE)
    {
        $lastError = \json_last_error();

        if (!$asString) return $lastError;

       //Define the errors.
        $constants = \get_defined_constants(TRUE);
        $errorStrings = array();

        foreach ($constants["json"] as $name => $value)
            if (!strncmp($name, "JSON_ERROR_", 11))
                $errorStrings[$value] = $name;

        return isset($errorStrings[$lastError]) ? $errorStrings[$lastError] : FALSE;
    }

    public static function getLastErrorMessage()
    {
        return \json_last_error_msg();
    }

    public static function clean($jsonString)
    {
        if (!is_string($jsonString) || !$jsonString) return '';

       //Remove unsupported characters
       //Check http://www.php.net/chr for details
        for ($i = 0; $i <= 31; ++$i)
            $jsonString = str_replace(chr($i), "", $jsonString);

        $jsonString = str_replace(chr(127), "", $jsonString);

       //Remove the BOM (Byte Order Mark)
       //It's the most common that some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
       //Here we detect it and we remove it, basically it's the first 3 characters.
        if (0 === strpos(bin2hex($jsonString), 'efbbbf')) $jsonString = substr($jsonString, 3);

        return $jsonString;
    }

    public static function encode($value, $options = 0, $depth = 512)
    {
        return \json_encode($value, $options, $depth);
    }

    public static function decode($jsonString, $asArray = TRUE, $depth = 512, $options = JSON_BIGINT_AS_STRING)
    {
        if (!is_string($jsonString) || !$jsonString) return NULL;

        $result = \json_decode($jsonString, $asArray, $depth, $options);

        if ($result === NULL)
            switch (self::getLastError())
            {
                case JSON_ERROR_SYNTAX :
                   //Try to clean json string if syntax error occured
                    $jsonString = self::clean($jsonString);
                    $result = \json_decode($jsonString, $asArray, $depth, $options);
                    break;

                default:
                   //Unsupported error
            }

        return $result;
    }
}

Мысалды пайдалану:

$json_data = file_get_contents("test.json");
$array = Json::decode($json_data, TRUE);
var_dump($array);
echo "Last error (" , Json::getLastError() , "): ", Json::getLastError(TRUE), PHP_EOL;
6
қосылды
Мен үшін керемет жұмыс істеді! Көп рақмет сізге!!
қосылды автор Giuseppe, көзі
Мен күні бойы JSON-ті қамтитын әмбебап кодталған файлмен күресіп жүрмін және бұл сынып соңында маған пайдалы PHP массивін алды - рахмет!
қосылды автор Hill79, көзі

Барлық заттарды бір жерге жинау үшін, мен автоматты түрде түзету әрекеттерін декодтау арқылы JSON қаптамасын дайындадым. Ең соңғы нұсқаны менің GitHub Gist бөлімінен табуға болады.

abstract class Json
{
    public static function getLastError($asString = FALSE)
    {
        $lastError = \json_last_error();

        if (!$asString) return $lastError;

       //Define the errors.
        $constants = \get_defined_constants(TRUE);
        $errorStrings = array();

        foreach ($constants["json"] as $name => $value)
            if (!strncmp($name, "JSON_ERROR_", 11))
                $errorStrings[$value] = $name;

        return isset($errorStrings[$lastError]) ? $errorStrings[$lastError] : FALSE;
    }

    public static function getLastErrorMessage()
    {
        return \json_last_error_msg();
    }

    public static function clean($jsonString)
    {
        if (!is_string($jsonString) || !$jsonString) return '';

       //Remove unsupported characters
       //Check http://www.php.net/chr for details
        for ($i = 0; $i <= 31; ++$i)
            $jsonString = str_replace(chr($i), "", $jsonString);

        $jsonString = str_replace(chr(127), "", $jsonString);

       //Remove the BOM (Byte Order Mark)
       //It's the most common that some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
       //Here we detect it and we remove it, basically it's the first 3 characters.
        if (0 === strpos(bin2hex($jsonString), 'efbbbf')) $jsonString = substr($jsonString, 3);

        return $jsonString;
    }

    public static function encode($value, $options = 0, $depth = 512)
    {
        return \json_encode($value, $options, $depth);
    }

    public static function decode($jsonString, $asArray = TRUE, $depth = 512, $options = JSON_BIGINT_AS_STRING)
    {
        if (!is_string($jsonString) || !$jsonString) return NULL;

        $result = \json_decode($jsonString, $asArray, $depth, $options);

        if ($result === NULL)
            switch (self::getLastError())
            {
                case JSON_ERROR_SYNTAX :
                   //Try to clean json string if syntax error occured
                    $jsonString = self::clean($jsonString);
                    $result = \json_decode($jsonString, $asArray, $depth, $options);
                    break;

                default:
                   //Unsupported error
            }

        return $result;
    }
}

Мысалды пайдалану:

$json_data = file_get_contents("test.json");
$array = Json::decode($json_data, TRUE);
var_dump($array);
echo "Last error (" , Json::getLastError() , "): ", Json::getLastError(TRUE), PHP_EOL;
6
қосылды
Мен үшін керемет жұмыс істеді! Көп рақмет сізге!!
қосылды автор Giuseppe, көзі
Мен күні бойы JSON-ті қамтитын әмбебап кодталған файлмен күресіп жүрмін және бұл сынып соңында маған пайдалы PHP массивін алды - рахмет!
қосылды автор Hill79, көзі

Сіз JSON-ді көрсетпеди, бірақ бұл дыбыс дәлелде жарамсыз UTF-8 дәйектілігі болуы мүмкін, көптеген онлайн валидатор оны ұстамайды. деректеріңіздің UTF-8 екеніне көз жеткізіңіз, сондай-ақ, сізде шетелдік таңбалардың бар-жоғын тексеріңіз. Қатені көре алу үшін сізге PHP5 қажет емес, error_log() пайдаланыңыз мәселелерді тіркеу үшін.

1
қосылды

I had same issue. For me it was causing by echo "

". I was trying to pass json string to another PHP file using exit(json_encode(utf8ize($resp_array))); At the beginning of file i had decleared break line tag... So this was error for me. Removing this break line tag , i was able to decoding my json string an other PHP file..
0
қосылды

I had same issue. For me it was causing by echo "

".


Json жолын басқа PHP файлына өтуге тырыстым:
exit(json_encode(utf8ize($resp_array)));

Файлдың басында мен үзіліс сызық белгісін шығардым ... Бұл менің қателігім болды. Бұл үзіліс сызығының белгісін алып тастау [...]
0
қосылды
бұл мәселеде сипатталған мәселе емес, бірақ бұл мәселенің өте таралған түрі және оны анықтау қиын болуы мүмкін, сондықтан ол туралы айтқан дұрыс.
қосылды автор Simba, көзі

I had same issue. For me it was causing by echo "

".


Json жолын басқа PHP файлына өтуге тырыстым:
exit(json_encode(utf8ize($resp_array)));

Файлдың басында мен үзіліс сызық белгісін шығардым ... Бұл менің қателігім болды. Бұл үзіліс сызығының белгісін алып тастау [...]
0
қосылды
бұл мәселеде сипатталған мәселе емес, бірақ бұл мәселенің өте таралған түрі және оны анықтау қиын болуы мүмкін, сондықтан ол туралы айтқан дұрыс.
қосылды автор Simba, көзі

I had same issue. For me it was causing by echo "

".


Json жолын басқа PHP файлына өтуге тырыстым:
exit(json_encode(utf8ize($resp_array)));

Файлдың басында мен үзіліс сызық белгісін шығардым ... Бұл менің қателігім болды. Бұл үзіліс сызығының белгісін алып тастау [...]
0
қосылды
бұл мәселеде сипатталған мәселе емес, бірақ бұл мәселенің өте таралған түрі және оны анықтау қиын болуы мүмкін, сондықтан ол туралы айтқан дұрыс.
қосылды автор Simba, көзі