diff --git a/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php
index a95c14b30e..104e4e87cc 100644
--- a/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php
+++ b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\TypedData\Plugin\DataType;
 
+use Drupal\Core\TypedData\DataDefinition;
 use Drupal\Core\TypedData\TypedData;
 use Drupal\Core\TypedData\ComplexDataInterface;
 
@@ -113,7 +114,8 @@ public function get($property_name) {
         $value = $this->values[$property_name];
       }
       // If the property is unknown, this will throw an exception.
-      $this->properties[$property_name] = $this->getTypedDataManager()->getPropertyInstance($this, $property_name, $value);
+      $this->properties[$property_name] = $this->getTypedDataManager()
+        ->getPropertyInstance($this, $property_name, $value);
     }
     return $this->properties[$property_name];
   }
@@ -155,11 +157,29 @@ protected function writePropertyValue($property_name, $value) {
    */
   public function getProperties($include_computed = FALSE) {
     $properties = [];
-    foreach ($this->definition->getPropertyDefinitions() as $name => $definition) {
-      if ($include_computed || !$definition->isComputed()) {
-        $properties[$name] = $this->get($name);
+    $PropertyDefinitions = $this->definition->getPropertyDefinitions();
+    if (!empty($PropertyDefinitions)) {
+      foreach ($PropertyDefinitions as $name => $definition) {
+        if ($include_computed || !$definition->isComputed()) {
+          $properties[$name] = $this->get($name);
+        }
+      }
+    }
+    //If module creator send an array to map dataType and don't setPropertyDefinition,
+    //Auto creating the PropertyDefinition so that it can be normalized
+    elseif (get_class($this->getDataDefinition()) == 'Drupal\Core\TypedData\MapDataDefinition') {
+      $values = $this->values;
+      if (is_array($values)) {
+        foreach ($values as $key => $value) {
+          $properties[$key] = \Drupal::typedDataManager()->create(
+            DataDefinition::create('any'),
+            $value,
+            $key
+          );
+        };
       }
     }
+
     return $properties;
   }
 
diff --git a/core/tests/Drupal/Tests/Core/TypedData/MapDataNormalizeTest.php b/core/tests/Drupal/Tests/Core/TypedData/MapDataNormalizeTest.php
new file mode 100644
index 0000000000..8a41c862f0
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/TypedData/MapDataNormalizeTest.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Drupal\Tests\Core\TypedData;
+
+use Drupal\Core\TypedData\DataDefinition;
+use Drupal\Core\TypedData\MapDataDefinition;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * @group typedData
+ */
+class MapDataNormalizeTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+
+  public static $modules = ['system', 'serialization'];
+
+  /**
+   * The serializer type.
+   */
+  protected $serializer;
+
+  /**
+   * The typeDataManager.
+   */
+  protected $typedDataManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->serializer = \Drupal::service('serializer');
+    $this->typedDataManager = \Drupal::typedDataManager();
+
+  }
+
+  /**
+   * Test whether map data can be normalized
+   */
+  public function testMapNormalize() {
+    $typed_data = $this->buildExampleTypedData();
+    $data = $this->serializer->normalize($typed_data, 'json');
+    $expect_value = [
+      'key1' => 'value1',
+      'key2' => 'value2',
+    ];
+    $this->assertEquals($expect_value, $data);
+  }
+
+  /**
+   * Test whether map data with properties can be normalized
+   */
+  public function testMapWithPropertiesNormalize() {
+    $typed_data = $this->buildExampleTypedDataWithProperties();
+    $data = $this->serializer->normalize($typed_data, 'json');
+    $expect_value = [
+      'key1' => 'value1',
+      'key2' => 'value2',
+    ];
+    $this->assertEquals($expect_value, $data);
+  }
+
+  /**
+   * Builds some example type data object with no properties.
+   */
+  protected function buildExampleTypedData() {
+    $tree = [
+      'key1' => 'value1',
+      'key2' => 'value2',
+    ];
+    $map_data_definition = MapDataDefinition::create();
+    $typed_data = $this->typedDataManager->create(
+      $map_data_definition,
+      $tree,
+      'test name'
+    );
+    return $typed_data;
+  }
+
+  /**
+   * Builds some example type data object with properties.
+   */
+  protected function buildExampleTypedDataWithProperties() {
+    $tree = [
+      'key1' => 'value1',
+      'key2' => 'value2',
+    ];
+    $map_data_definition = MapDataDefinition::create();
+    foreach (array_keys($tree) as $property_name) {
+      $map_data_definition->setPropertyDefinition($property_name, DataDefinition::create('string'));
+    }
+    $typed_data = $this->typedDataManager->create(
+      $map_data_definition,
+      $tree,
+      'test name'
+    );
+
+    return $typed_data;
+  }
+
+}
