Обнаружить плохие json данные в PHP json_decode ()?

К сожалению, вы можете указать только конструкцию в предложении where в этом экземпляре. Кажется странным, что вы не можете указать Int16, Int32 и т. Д., Но я уверен, что существует некоторая глубокая причина внедрения, лежащая в основе решения не допускать типы значений в предложении where.

Я предполагаю, что единственное решение должно выполнить проверку времени выполнения, которая, к сожалению, предотвращает проблему, возникающую во время компиляции. Это было бы похоже на: -

static bool IntegerFunction<T>(T value) where T : struct {
  if (typeof(T) != typeof(Int16)  &&
      typeof(T) != typeof(Int32)  &&
      typeof(T) != typeof(Int64)  &&
      typeof(T) != typeof(UInt16) &&
      typeof(T) != typeof(UInt32) &&
      typeof(T) != typeof(UInt64)) {
    throw new ArgumentException(
      string.Format("Type '{0}' is not valid.", typeof(T).ToString()));
  }

  // Rest of code...
}

Который немного уродлив, я знаю, но по крайней мере предоставляет требуемые ограничения.

Я также посмотрел бы на возможную производительность последствия для этой реализации, возможно, есть более быстрый выход.

47
задан soren.qvist 27 February 2010 в 16:55
поделиться

2 ответа

Вот пара вещей о json_decode :

  • он возвращает данные или null, если есть ошибка
  • он также может вернуть null, если ошибки нет: когда строка JSON содержит null
  • он выдает предупреждение там, где есть предупреждение -- предупреждение, которое вы хотите заставить исчезнуть.


Для решения проблемы с предупреждением можно было бы использовать оператор @ (я не часто рекомендую его использовать, так как он значительно усложняет отладку... Но здесь выбор невелик) :

$_POST = array(
    'bad data'
);
$data = @json_decode($_POST);

Затем нужно проверить, не является ли $data null -- и.., чтобы избежать случая, когда json_decode возвращает null для null в строке JSON, вы можете проверить json_last_error, который (цитирование) :

возвращает последнюю ошибку (если таковая имеется) возникшая при последнем разборе JSON.


Что означает, что вам придется использовать код вроде следующего :

if ($data === null
    && json_last_error() !== JSON_ERROR_NONE) {
    echo "incorrect data";
}
97
ответ дан 26 November 2019 в 19:21
поделиться

Я просто провел час, проходя все возможные решения на этой странице. Я брал на себя смелость коллектива все эти возможные решения в одна функция , для создания этого более быстрым и легче попытаться отладить.

я надеюсь, что это может быть полезно для кого-то еще.

<?php
/**
 * Decontaminate text
 *
 * Primary sources:
 *  - https://stackoverflow.com/questions/17219916/json-decode-returns-json-error-syntax-but-online-formatter-says-the-json-is-ok
 *  - https://stackoverflow.com/questions/2348152/detect-bad-json-data-in-php-json-decode
 */
function decontaminate_text(
  $text,
  $remove_tags = true,
  $remove_line_breaks = true,
  $remove_BOM = true,
  $ensure_utf8_encoding = true,
  $ensure_quotes_are_properly_displayed = true,
  $decode_html_entities = true
){

  if ( '' != $text && is_string( $text ) ) {
    $text = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $text );
    $text = str_replace(']]>', ']]&gt;', $text);

    if( $remove_tags ){
      // Which tags to allow (none!)
      // $text = strip_tags($text, '<p>,<strong>,<span>,<a>');
      $text = strip_tags($text, '');
    }

    if( $remove_line_breaks ){
      $text = preg_replace('/[\r\n\t ]+/', ' ', $text);
      $text = trim( $text );
    }

    if( $remove_BOM ){
      // Source: https://stackoverflow.com/a/31594983/1766219
      if( 0 === strpos( bin2hex( $text ), 'efbbbf' ) ){
        $text = substr( $text, 3 );
      }
    }

    if( $ensure_utf8_encoding ){

      // Check if UTF8-encoding
      if( utf8_encode( utf8_decode( $text ) ) != $text ){
        $text = mb_convert_encoding( $text, 'utf-8', 'utf-8' );
      }
    }

    if( $ensure_quotes_are_properly_displayed ){
      $text = str_replace('&quot;', '"', $text);
    }

    if( $decode_html_entities ){
      $text = html_entity_decode( $text );
    }

    /**
     * Other things to try
     * - the chr-function: https://stackoverflow.com/a/20845642/1766219
     * - stripslashes (THIS ONE BROKE MY JSON DECODING, AFTER IT STARTED WORKING, THOUGH): https://stackoverflow.com/a/28540745/1766219
     * - This (improved?) JSON-decoder didn't help me, but it sure looks fancy: https://stackoverflow.com/a/43694325/1766219
     */

  }
  return $text;
}

// Example use
$text = decontaminate_text( $text );

// $text = decontaminate_text( $text, false ); // Debug attempt 1
// $text = decontaminate_text( $text, false, false ); // Debug attempt 2
// $text = decontaminate_text( $text, false, false, false ); // Debug attempt 3

$decoded_text = json_decode( $text, true );
echo json_last_error_msg() . ' - ' . json_last_error();
?>

я поддержу его здесь: https://github.com/zethodderskov/decontaminate-text-in-php/blob/master/decontaminate-text-preparing-it-for-json-decode.php

-1
ответ дан 26 November 2019 в 19:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: