Cum se poate evita ca un modul care codifică json să scoată „u0026” în loc de „&”? (Drupal, 7)

Diana a intrebat.

Folosesc un modul pentru a codifica în json, dar acesta scoate „u0026” în loc de „&„.

Cum pot evita acest lucru?

1 răspunsuri
arpitr

Explicație:

Modulul Content as Json returnează pur și simplu conținutul prin rularea acestuia prin drupal_json_output(), care la rândul său apelează drupal_json_encode().în interiorul drupal_json_encode drupal se asigură că are conversie unicode pentru caracterele speciale, inclusiv ‘<‘,’>’,’&’.

function drupal_json_encode($var) {
  // The PHP version cannot change within a request.
  static $php530;

  if (!isset($php530)) {
    $php530 = version_compare(PHP_VERSION, '5.3.0', '>=');
  }

  if ($php530) {
    // Encode <, >, ', &, and " using the json_encode() options parameter.
    return json_encode($var, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
  }

  // json_encode() escapes <, >, ', &, and " using its options parameter, but
  // does not support this parameter prior to PHP 5.3.0.  Use a helper instead.
  include_once DRUPAL_ROOT . '/includes/json-encode.inc';
  return drupal_json_encode_helper($var);
}

Dacă vedeți dacă versiunea dvs. de php este mai mare de 5.3 atunci json_encode() ia el însuși argumentul pentru a se asigura că toate sunt convertite unicode, dacă php este mai mic sau mai mic de 5.3, atunci drupal include un ajutor json-encode.inc care face același lucru.

Soluție:

Calea 1: Cel mai bine ar fi să se ocupe clientul care consumă datele json, să aibă un parser echivalent și pe partea consumatorului.

Calea 2: Conectați-vă la modulul contentasjson pentru a returna json așa cum doriți. modificați callback-ul de meniu pentru a înregistra propriul callback de pagină.

function mymodule_menu_alter(&$itmes) {
  $item['contentasjson/%/%']['page callback'] = '_my_custom_json_as_content';
}

//Copy the code as it from contentasjson module `contentasjson_get_data()` callback with a small change the json_encode function.
function _my_custom_json_as_content($type, $id) {
  switch ($type) {
    case "node" :
      $data = _contentasjson_get_node( $id );
      break;

    case "comment" :
      $data = _contentasjson_get_comment( $id );
      break;

    case "menu" :
      $data = _contentasjson_get_menu( $id );
      break;

    case "taxonomy_term" :
      $data = _contentasjson_get_taxonomy_term( $id );
      break;

    case "taxonomy_vocabulary" :
      $data = _contentasjson_get_taxonomy_vocabulary( $id );
      break;

    case "custom_data" :
      $data = _contentasjson_get_custom_data();
      break;

    default :
      $data = _contentasjson_get_error_message_type( $type );
      break;
  }

  // If false (no data object returned), generate return message
  $data = ($data == FALSE ? _contentasjson_get_error_message_id( $id ) : $data);
  // Here is the small change we are doing.
  json_encode( $data );
}

Tags: