diff --git a/modules/order/commerce_order.services.yml b/modules/order/commerce_order.services.yml
index 70152282..561559f6 100644
--- a/modules/order/commerce_order.services.yml
+++ b/modules/order/commerce_order.services.yml
@@ -62,3 +62,10 @@ services:
     arguments: ['@current_route_match']
     tags:
       - { name: commerce_store.store_resolver, priority: 100 }
+  commerce_order.normalizer.adjustment:
+    class: Drupal\commerce_order\Normalizer\AnyAdjustmentNormalizer
+    tags:
+    # This normalizer must just be higher than serializer.normalizer.typed_data
+    # So setting priority as 0 here.
+    # @see \Drupal\commerce_order\Normalizer\ObjectAnyNormalizer::supportsNormalization
+      - { name: normalizer, priority: 0}
diff --git a/modules/order/src/Normalizer/AnyAdjustmentNormalizer.php b/modules/order/src/Normalizer/AnyAdjustmentNormalizer.php
new file mode 100644
index 00000000..955e9bf8
--- /dev/null
+++ b/modules/order/src/Normalizer/AnyAdjustmentNormalizer.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\commerce_order\Normalizer;
+
+use Drupal\commerce_order\Adjustment;
+use Drupal\serialization\Normalizer\NormalizerBase;
+
+/**
+ * Custom normalizer for 'any' typed data with Adjustment stored.
+ */
+class AnyAdjustmentNormalizer extends NormalizerBase {
+
+  /**
+   * The interface or class that this Normalizer supports.
+   *
+   * @var string
+   */
+  protected $supportedInterfaceOrClass = 'Drupal\Core\TypedData\Plugin\DataType\Any';
+
+  /**
+   * {@inheritdoc}
+   */
+  public function supportsNormalization($data, $format = NULL) {
+    /* @var \Drupal\Core\TypedData\Plugin\DataType\Any $data */
+    if (parent::supportsNormalization($data, $format)) {
+      $value = $data->getValue();
+      if ($value instanceof Adjustment) {
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function normalize($object, $format = NULL, array $context = []) {
+    $attributes = [];
+    /** @var \Drupal\commerce_order\Adjustment $adjustment */
+    $adjustment = $object->getValue();
+    $attributes['type'] = $adjustment->getType();
+    $attributes['label'] = $adjustment->getLabel();
+    $attributes['amount'] = $adjustment->getAmount()->toArray();
+    $attributes['percentage'] = $adjustment->getPercentage();
+    $attributes['source_id'] = $adjustment->getSourceId();
+    $attributes['included'] = $adjustment->isIncluded();
+    $attributes['locked'] = $adjustment->isLocked();
+    return $attributes;
+  }
+
+}
diff --git a/modules/order/tests/src/Kernel/AdjustmentItemNormalizeTest.php b/modules/order/tests/src/Kernel/AdjustmentItemNormalizeTest.php
new file mode 100644
index 00000000..5be63189
--- /dev/null
+++ b/modules/order/tests/src/Kernel/AdjustmentItemNormalizeTest.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace Drupal\Tests\commerce_order\Kernel;
+
+use Drupal\commerce_order\Adjustment;
+use Drupal\commerce_price\Price;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\Tests\commerce\Kernel\CommerceKernelTestBase;
+
+/**
+ * Tests the normalization of adjustment field.
+ *
+ * @group commerce
+ */
+class AdjustmentItemNormalizeTest extends CommerceKernelTestBase {
+
+  /**
+   * The test entity.
+   *
+   * @var \Drupal\entity_test\Entity\EntityTest
+   */
+  protected $testEntity;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'entity_reference_revisions',
+    'profile',
+    'state_machine',
+    'commerce_order',
+    'serialization',
+  ];
+
+  /**
+   * The serializer.
+   *
+   * @var \Symfony\Component\Serializer\Serializer
+   */
+  protected $serializer;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $field_storage = FieldStorageConfig::create([
+      'field_name' => 'test_adjustments',
+      'entity_type' => 'entity_test',
+      'type' => 'commerce_adjustment',
+      'cardinality' => FieldStorageConfig::CARDINALITY_UNLIMITED,
+    ]);
+    $field_storage->save();
+
+    $field = FieldConfig::create([
+      'field_name' => 'test_adjustments',
+      'entity_type' => 'entity_test',
+      'bundle' => 'entity_test',
+    ]);
+    $field->save();
+
+    $entity = EntityTest::create([
+      'name' => 'Test',
+    ]);
+    $entity->save();
+    $this->testEntity = $entity;
+
+    $this->serializer = \Drupal::service('serializer');
+  }
+
+  /**
+   * Tests the normalization of adjustment field.
+   */
+  public function testAdjustmentItemNormalize() {
+    /** @var \Drupal\Core\Field\FieldItemListInterface $adjustment_item_list */
+    $adjustment_item_list = $this->testEntity->test_adjustments;
+    $adjustment_item_list->appendItem(new Adjustment([
+      'type' => 'custom',
+      'label' => '10% off',
+      'amount' => new Price('-1.00', 'USD'),
+      'percentage' => '0.1',
+      'source_id' => '1',
+      'included' => FALSE,
+      'locked' => TRUE,
+    ]));
+    $expected = [
+      0 => [
+        'value' => [
+          'type' => 'custom',
+          'label' => '10% off',
+          'amount' => [
+            'number' => '-1.00',
+            'currency_code' => 'USD',
+          ],
+          'percentage' => '0.1',
+          'source_id' => '1',
+          'included' => FALSE,
+          'locked' => TRUE,
+        ],
+      ],
+    ];
+    $normalized = $this->serializer->normalize($adjustment_item_list);
+    $this->assertSame($expected, $normalized);
+  }
+
+}
