You are here

class Json in Migrate Plus 8.2

Same name and namespace in other branches
  1. 8.5 src/Plugin/migrate_plus/data_parser/Json.php \Drupal\migrate_plus\Plugin\migrate_plus\data_parser\Json
  2. 8 src/Plugin/migrate_plus/data_parser/Json.php \Drupal\migrate_plus\Plugin\migrate_plus\data_parser\Json
  3. 8.3 src/Plugin/migrate_plus/data_parser/Json.php \Drupal\migrate_plus\Plugin\migrate_plus\data_parser\Json
  4. 8.4 src/Plugin/migrate_plus/data_parser/Json.php \Drupal\migrate_plus\Plugin\migrate_plus\data_parser\Json

Obtain JSON data for migration.

Plugin annotation


@DataParser(
  id = "json",
  title = @Translation("JSON")
)

Hierarchy

Expanded class hierarchy of Json

File

src/Plugin/migrate_plus/data_parser/Json.php, line 16

Namespace

Drupal\migrate_plus\Plugin\migrate_plus\data_parser
View source
class Json extends DataParserPluginBase implements ContainerFactoryPluginInterface {

  /**
   * The request headers passed to the data fetcher.
   *
   * @var array
   */
  protected $headers = [];

  /**
   * Iterator over the JSON data.
   *
   * @var \Iterator
   */
  protected $iterator;

  /**
   * Retrieves the JSON data and returns it as an array.
   *
   * @param string $url
   *   URL of a JSON feed.
   *
   * @return array
   *   The selected data to be iterated.
   *
   * @throws \GuzzleHttp\Exception\RequestException
   */
  protected function getSourceData($url) {
    $response = $this
      ->getDataFetcherPlugin()
      ->getResponseContent($url);

    // Convert objects to associative arrays.
    $source_data = json_decode($response, TRUE);

    // If json_decode() has returned NULL, it might be that the data isn't
    // valid utf8 - see http://php.net/manual/en/function.json-decode.php#86997.
    if (is_null($source_data)) {
      $utf8response = utf8_encode($response);
      $source_data = json_decode($utf8response);
    }

    // Backwards-compatibility for depth selection.
    if (is_int($this->itemSelector)) {
      return $this
        ->selectByDepth($source_data);
    }

    // Otherwise, we're using xpath-like selectors.
    $selectors = explode('/', trim($this->itemSelector, '/'));
    foreach ($selectors as $selector) {
      if (!empty($selector)) {
        $source_data = $source_data[$selector];
      }
    }
    return $source_data;
  }

  /**
   * Get the source data for reading.
   *
   * @param array $raw_data
   *   Raw data from the JSON feed.
   *
   * @return array
   *   Selected items at the requested depth of the JSON feed.
   */
  protected function selectByDepth(array $raw_data) {

    // Return the results in a recursive iterator that can traverse
    // multidimensional arrays.
    $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($raw_data), \RecursiveIteratorIterator::SELF_FIRST);
    $items = [];

    // Backwards-compatibility - an integer item_selector is interpreted as a
    // depth. When there is an array of items at the expected depth, pull that
    // array out as a distinct item.
    $identifierDepth = $this->itemSelector;
    $iterator
      ->rewind();
    while ($iterator
      ->valid()) {
      $item = $iterator
        ->current();
      if (is_array($item) && $iterator
        ->getDepth() == $identifierDepth) {
        $items[] = $item;
      }
      $iterator
        ->next();
    }
    return $items;
  }

  /**
   * {@inheritdoc}
   */
  protected function openSourceUrl($url) {

    // (Re)open the provided URL.
    $source_data = $this
      ->getSourceData($url);
    $this->iterator = new \ArrayIterator($source_data);
    return TRUE;
  }

  /**
   * {@inheritdoc}
   */
  protected function fetchNextRow() {
    $current = $this->iterator
      ->current();
    if ($current) {
      foreach ($this
        ->fieldSelectors() as $field_name => $selector) {
        $field_data = $current;
        $field_selectors = explode('/', trim($selector, '/'));
        foreach ($field_selectors as $field_selector) {
          $field_data = $field_data[$field_selector];
        }
        $this->currentItem[$field_name] = $field_data;
      }
      if (!empty($this->configuration['include_raw_data'])) {
        $this->currentItem['raw'] = $current;
      }
      $this->iterator
        ->next();
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DataParserPluginBase::$activeUrl protected property Index of the currently-open url.
DataParserPluginBase::$currentId protected property Value of the ID for the current item when iterating.
DataParserPluginBase::$currentItem protected property Current item when iterating.
DataParserPluginBase::$dataFetcher protected property The data retrieval client.
DataParserPluginBase::$itemSelector protected property String indicating how to select an item's data from the source.
DataParserPluginBase::$urls protected property List of source urls.
DataParserPluginBase::count public function
DataParserPluginBase::create public static function
DataParserPluginBase::current public function
DataParserPluginBase::fieldSelectors protected function Return the selectors used to populate each configured field.
DataParserPluginBase::getDataFetcherPlugin public function Returns the initialized data fetcher plugin.
DataParserPluginBase::key public function
DataParserPluginBase::next public function Implementation of Iterator::next().
DataParserPluginBase::nextSource protected function Advances the data parser to the next source url.
DataParserPluginBase::rewind public function 1
DataParserPluginBase::valid public function
DataParserPluginBase::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase::__construct 3
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
Json::$headers protected property The request headers passed to the data fetcher.
Json::$iterator protected property Iterator over the JSON data.
Json::fetchNextRow protected function Retrieves the next row of data from the open source URL, populating currentItem. Overrides DataParserPluginBase::fetchNextRow
Json::getSourceData protected function Retrieves the JSON data and returns it as an array.
Json::openSourceUrl protected function Opens the specified URL. Overrides DataParserPluginBase::openSourceUrl
Json::selectByDepth protected function Get the source data for reading.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.