diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0bd1f1d4715be3b5f6a614316072f8d39ff3f7f7..cc43a5a9719687566b48b3348d6cf4c662c07018 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -171,6 +171,12 @@ test:3.9:
   <<: *test_template
 
 
+test:3.10:
+  stage: test
+  image: pauldmccarthy/fsleyes-py310-wxpy4-gtk3
+  <<: *test_template
+
+
 test:build-pypi-dist:
   stage: test
   image: pauldmccarthy/fsleyes-py37-wxpy4-gtk3
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 56ce3f6b90c9afe77eabd6b0ea60d5cfad824f5f..1d1ae7c2123250837e0a6e0b705f828a7ff91e55 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,6 +2,18 @@ This document contains the ``fslpy`` release history in reverse chronological
 order.
 
 
+3.8.0 (Under development)
+-------------------------
+
+
+Changed
+^^^^^^^
+
+
+* BIDS and ``dcm2niix`` ``.json`` sidecar files with control characters
+  are now accepted.
+
+
 3.7.0 (Friday 20th August 2021)
 -------------------------------
 
diff --git a/README.rst b/README.rst
index 493d7e30eaee4c13e023bf05c1972d92e62deb02..26cd046795fc3f68f429a40662428bfd71bfa17d 100644
--- a/README.rst
+++ b/README.rst
@@ -19,7 +19,7 @@ programming library written in Python. It is used by `FSLeyes
 <https://git.fmrib.ox.ac.uk/fsl/fsleyes/fsleyes/>`_.
 
 
-``fslpy`` is tested against Python versions 3.7, 3.8 and 3.9.
+``fslpy`` is tested against Python versions 3.7, 3.8, 3.9, and 3.10.
 
 
 Installation
diff --git a/fsl/data/image.py b/fsl/data/image.py
index e21ad87c2cf34cfe629ecba94e7cf2890cfb0472..80cffb6a97efb7964c32d846af9715c19d3f5d0a 100644
--- a/fsl/data/image.py
+++ b/fsl/data/image.py
@@ -1569,7 +1569,7 @@ def loadMetadata(image):
     jsonfile = op.join(dirname, '{}.json'.format(basename))
     if op.exists(jsonfile):
         with open(jsonfile, 'rt') as f:
-            return json.load(f)
+            return json.load(f, strict=False)
 
     return {}
 
diff --git a/fsl/utils/bids.py b/fsl/utils/bids.py
index 671fb4c28650d912ff1579ab350cf5e99ae0c116..61fc12830aa324848d0a3b32c7d350a800fc2b4b 100644
--- a/fsl/utils/bids.py
+++ b/fsl/utils/bids.py
@@ -187,7 +187,7 @@ def isBIDSFile(filename, strict=True):
 def loadMetadataFile(filename):
     """Load ``filename`` (assumed to be JSON), returning its contents. """
     with open(filename, 'rt') as f:
-        return json.load(f)
+        return json.load(f, strict=False)
 
 
 def loadMetadata(filename):
diff --git a/tests/test_bids.py b/tests/test_bids.py
index 4a2bc1e10c76bf03027962eb8cb2f7c4a4551bd8..52c6bb444e329a3ee89b5a57b126a1bffab6ed63 100644
--- a/tests/test_bids.py
+++ b/tests/test_bids.py
@@ -110,6 +110,21 @@ def test_loadMetadata():
         assert fslbids.loadMetadata(t1) == {**meta4, **meta2, **meta1}
 
 
+def test_loadMetadata_control_characters():
+    dd     = Path('dataset_description.json')
+    t1     = Path('sub-01/func/sub-01_task-stim_bold.nii.gz')
+    json1  = Path('sub-01/func/sub-01_task-stim_bold.json')
+    meta1  =  {"a" : "1",  "b" : "2\x19\x20"}
+    smeta1 = '{"a" : "1",  "b" : "2\x19\x20"}'
+
+    with tempdir():
+        dd.touch()
+        Path(op.dirname(t1)).mkdir(parents=True)
+        t1.touch()
+        assert fslbids.loadMetadata(t1) == {}
+        json1.write_text(smeta1)
+        assert fslbids.loadMetadata(t1) == meta1
+
 
 def test_loadMetadata_symlinked():
     ddreal = Path('a')
diff --git a/tests/test_image.py b/tests/test_image.py
index 34a5482ce8f63a7d66ed83d881f9a575680a55ab..6f7e07b4c87c2f90075f9156dadfbfb0b6df72f9 100644
--- a/tests/test_image.py
+++ b/tests/test_image.py
@@ -1484,6 +1484,21 @@ def test_loadMeta_badJSON():
         assert list(img.metaKeys()) == []
 
 
+def test_loadMeta_control_characters():
+    with tempdir():
+        make_image('image.nii.gz')
+
+        with open('image.json', 'wt') as f:
+            f.write('{"a" : 1, "b" : "abc\x19\x1b"}')
+
+        # bad json should not cause failure
+        img = fslimage.Image('image.nii.gz', loadMeta=True)
+
+        assert list(img.metaKeys()) == ['a', 'b']
+        assert img.getMeta('a')     == 1
+        assert img.getMeta('b')     == 'abc\x19\x1b'
+
+
 def test_loadMetadata():
     with tempdir():
         make_image('image.nii.gz')