diff -u b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php --- b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php +++ b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php @@ -3,6 +3,7 @@ namespace Drupal\Core\TypedData\Plugin\DataType; use Drupal\Core\TypedData\DataDefinition; +use Drupal\Core\TypedData\MapDataDefinition; use Drupal\Core\TypedData\TypedData; use Drupal\Core\TypedData\ComplexDataInterface; @@ -170,14 +171,23 @@ $values = $this->values; if (is_array($values)) { foreach ($values as $key => $value) { - $properties[$key] = \Drupal::typedDataManager()->create( + if (!empty($value) && is_array($value)) { + $properties[$key] = \Drupal::typedDataManager()->create( + MapDataDefinition::create(), + $value, + $key + ); + } + else { + $properties[$key] = \Drupal::typedDataManager()->create( // Give array's value a DataType,So that drupal can find which normalizer to be used to normalize it // Because we don't know the type of the value,so we use 'any', // If you don't want to use 'any',Please define it by yourself use setPropertyDefinition - DataDefinition::create('any'), - $value, - $key - ); + DataDefinition::create('any'), + $value, + $key + ); + } }; } }