diff --git a/Gemfile b/Gemfile
index e1ce9541b0e81887d6ac2dcae81c2687683beec0..2b35991d784207746b7bdecddeff4ea390c8d34a 100644
--- a/Gemfile
+++ b/Gemfile
@@ -654,7 +654,7 @@ gem 'valid_email', '~> 0.1' # rubocop:todo Gemfile/MissingFeatureCategory
 # JSON
 gem 'jsonb_accessor', '~> 1.3.10' # rubocop:todo Gemfile/MissingFeatureCategory
 gem 'json', '~> 2.7.2', feature_category: :shared
-gem 'json_schemer', '~> 0.2.18' # rubocop:todo Gemfile/MissingFeatureCategory
+gem 'json_schemer', '~> 2.3.0', feature_category: :shared
 gem 'oj', '~> 3.13.21' # rubocop:todo Gemfile/MissingFeatureCategory
 gem 'oj-introspect', '~> 0.7' # rubocop:todo Gemfile/MissingFeatureCategory
 gem 'multi_json', '~> 1.14.1' # rubocop:todo Gemfile/MissingFeatureCategory
diff --git a/Gemfile.checksum b/Gemfile.checksum
index 47d1c7e0e8eefded2981e354c65fe760f99297eb..ddd34a5c68c0e00b1a7165219ae2e14f82631494 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -140,7 +140,6 @@
 {"name":"dumb_delegator","version":"1.0.0","platform":"ruby","checksum":"ff5e411816d2d8ad8e260b269e712ae3839dddb0f9f8e18d3b1a3fe08f6d2e94"},
 {"name":"duo_api","version":"1.3.0","platform":"ruby","checksum":"87c9830e190fad32fdb086b023f555a3cf5cd4d6708a992f7a32efb2ce206176"},
 {"name":"e2mmap","version":"0.1.0","platform":"ruby","checksum":"45ee6bba2d97a7d91ee0885774261feee87e28c598355df31e93b56196ec0f59"},
-{"name":"ecma-re-validator","version":"0.3.0","platform":"ruby","checksum":"66a95bd8c2b0641baf1fbf9bd355a0dcf13c82c6883f6f496a722420a8b6e0d7"},
 {"name":"ed25519","version":"1.3.0","platform":"java","checksum":"8e5d2f8a5325c7a463d61d1a48406ce54074c610f3dccd889e6532c9527a3894"},
 {"name":"ed25519","version":"1.3.0","platform":"ruby","checksum":"514a5584f84d39daac568a17ec93a4e7261e140c52c562ed8c382c18456e627d"},
 {"name":"elasticsearch","version":"7.13.3","platform":"ruby","checksum":"58b1ad787fafd41836388176dc09e914b2f6e0b257e73b8a51a704ba6bf75b41"},
@@ -340,7 +339,7 @@
 {"name":"json","version":"2.7.2","platform":"java","checksum":"138e3038b5361b3d06ee2e8aa2be00bed0d0de4ef5f1553fc5935e5b93aca7ee"},
 {"name":"json","version":"2.7.2","platform":"ruby","checksum":"1898b5cbc81cd36c0fd4d0b7ad2682c39fb07c5ff682fc6265f678f550d4982c"},
 {"name":"json-jwt","version":"1.15.3","platform":"ruby","checksum":"66db4f14e538a774c15502a5b5b26b1f3e7585481bbb96df490aa74b5c2d6110"},
-{"name":"json_schemer","version":"0.2.18","platform":"ruby","checksum":"3362c21efbefdd12ce994e541a1e7fdb86fd267a6541dd8715e8a580fe3b6be6"},
+{"name":"json_schemer","version":"2.3.0","platform":"ruby","checksum":"9f1fa173b859ca520f15e9e8d08b0892ffca80b78dd8221feb3e360ff4cdeb35"},
 {"name":"jsonb_accessor","version":"1.3.10","platform":"java","checksum":"6630ac69dac46457b03e1352178ed3e2d7ba2d8edb99f2e9b64a0e60cda9ed26"},
 {"name":"jsonb_accessor","version":"1.3.10","platform":"ruby","checksum":"670f80a257ae39e3be9233c6a8ef3b03517e06687affe510dfe61237454c58e0"},
 {"name":"jsonpath","version":"1.1.2","platform":"ruby","checksum":"6804124c244d04418218acb85b15c7caa79c592d7d6970195300428458946d3a"},
@@ -670,6 +669,7 @@
 {"name":"simplecov-html","version":"0.12.3","platform":"ruby","checksum":"4b1aad33259ffba8b29c6876c12db70e5750cb9df829486e4c6e5da4fa0aa07b"},
 {"name":"simplecov-lcov","version":"0.8.0","platform":"ruby","checksum":"0115f31cb7ef5ec4334f5d9382c67fd43de2e5270e21b65bfc693da82dd713c1"},
 {"name":"simplecov_json_formatter","version":"0.1.4","platform":"ruby","checksum":"529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428"},
+{"name":"simpleidn","version":"0.2.3","platform":"ruby","checksum":"08ce96f03fa1605286be22651ba0fc9c0b2d6272c9b27a260bc88be05b0d2c29"},
 {"name":"singleton","version":"0.1.1","platform":"ruby","checksum":"b410b0417fcbb17bdfbc2d478ddba4c91e873d6e51c9d2d16b345c5ee5491c54"},
 {"name":"sixarm_ruby_unaccent","version":"1.2.0","platform":"ruby","checksum":"0043a6077bdf2c4b03040152676a07f8bf77144f9b007b1960ee5c94d13a4384"},
 {"name":"slack-messenger","version":"2.3.6","platform":"ruby","checksum":"58581e587debcbb769336cc7ebe4eb6ae411947fccf347e967a17ac9813e66d8"},
@@ -746,7 +746,6 @@
 {"name":"unleash","version":"3.2.2","platform":"ruby","checksum":"0f6e56498de920de66a01bceffb93933693ade646bb853fc70eb16bd1026b93b"},
 {"name":"unparser","version":"0.6.7","platform":"ruby","checksum":"ae42e73edfa273766e66c166368fb75ca5972cd8ec50c536253e0f6299a9dec8"},
 {"name":"uri","version":"0.13.0","platform":"ruby","checksum":"26553c2a9399762e1e8bebd4444b4361c4b21298cf1c864b22eeabc9c4998f24"},
-{"name":"uri_template","version":"0.7.0","platform":"ruby","checksum":"312c8fe13700db86ac9d05ea997af3db03abdf50c65b1801d775bc7a695f185d"},
 {"name":"valid_email","version":"0.1.3","platform":"ruby","checksum":"b81452b51b64c4beb67913f68db52c20ecb4d73d45512f5b282ab4a3f4416570"},
 {"name":"validate_email","version":"0.1.6","platform":"ruby","checksum":"9dfe9016d527b17a8d3a6e95e4dc50a125400eef899d13d4cc2a254393f82ee4"},
 {"name":"validate_url","version":"1.0.15","platform":"ruby","checksum":"72fe164c0713d63a9970bd6700bea948babbfbdcec392f2342b6704042f57451"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 0e77381d5ad755743c58fca2ce5c96348a4a79d8..86e45c0368cc51db174b41fbeef9296be9e8c82f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -540,8 +540,6 @@ GEM
     dumb_delegator (1.0.0)
     duo_api (1.3.0)
     e2mmap (0.1.0)
-    ecma-re-validator (0.3.0)
-      regexp_parser (~> 2.0)
     ed25519 (1.3.0)
     elasticsearch (7.13.3)
       elasticsearch-api (= 7.13.3)
@@ -1005,11 +1003,11 @@ GEM
       aes_key_wrap
       bindata
       httpclient
-    json_schemer (0.2.18)
-      ecma-re-validator (~> 0.3)
+    json_schemer (2.3.0)
+      bigdecimal
       hana (~> 1.3)
       regexp_parser (~> 2.0)
-      uri_template (~> 0.7)
+      simpleidn (~> 0.2)
     jsonb_accessor (1.3.10)
       activerecord (>= 5.0)
       activesupport (>= 5.0)
@@ -1715,6 +1713,7 @@ GEM
     simplecov-html (0.12.3)
     simplecov-lcov (0.8.0)
     simplecov_json_formatter (0.1.4)
+    simpleidn (0.2.3)
     singleton (0.1.1)
     sixarm_ruby_unaccent (1.2.0)
     slack-messenger (2.3.6)
@@ -1860,7 +1859,6 @@ GEM
       diff-lcs (~> 1.3)
       parser (>= 3.2.0)
     uri (0.13.0)
-    uri_template (0.7.0)
     valid_email (0.1.3)
       activemodel
       mail (>= 2.6.1)
@@ -2101,7 +2099,7 @@ DEPENDENCIES
   jira-ruby (~> 2.3.0)
   js_regex (~> 3.8)
   json (~> 2.7.2)
-  json_schemer (~> 0.2.18)
+  json_schemer (~> 2.3.0)
   jsonb_accessor (~> 1.3.10)
   jwt (~> 2.5)
   kaminari (~> 1.2.2)
diff --git a/ee/app/models/security/orchestration_policy_configuration.rb b/ee/app/models/security/orchestration_policy_configuration.rb
index a993272a7e41abdcfd42a49a87c535125e4cc876..bc961c7fc4134ec23e4e1c96c212931a2e4b6cc8 100644
--- a/ee/app/models/security/orchestration_policy_configuration.rb
+++ b/ee/app/models/security/orchestration_policy_configuration.rb
@@ -22,7 +22,7 @@ class OrchestrationPolicyConfiguration < ApplicationRecord
     POLICY_SCHEMA = JSONSchemer.schema(Rails.root.join(POLICY_SCHEMA_PATH))
     # json_schemer computes an $id fallback property for schemas lacking one.
     # But this schema is kept anonymous on purpose, so the $id is stripped.
-    POLICY_SCHEMA_JSON = POLICY_SCHEMA.as_json['root'].except('$id')
+    POLICY_SCHEMA_JSON = POLICY_SCHEMA.value.except('$id')
     AVAILABLE_POLICY_TYPES = (%i[scan_execution_policy pipeline_execution_policy] +
       Security::ScanResultPolicy::SCAN_RESULT_POLICY_TYPES).freeze
     JSON_SCHEMA_VALIDATION_TIMEOUT = 5.seconds