diff --git a/vcr/matchers.py b/vcr/matchers.py
index b54ed2f..8fe334e 100644
--- a/vcr/matchers.py
+++ b/vcr/matchers.py
@@ -49,7 +49,8 @@ def _transform_json(body):
     # Request body is always a byte string, but json.loads() wants a text
     # string. RFC 7159 says the default encoding is UTF-8 (although UTF-16
     # and UTF-32 are also allowed: hmmmmm).
-    return json.loads(body.decode('utf-8'))
+    if body:
+        return json.loads(body.decode('utf-8'))
 
 
 _xml_header_checker = _header_checker('text/xml')

AttributeError: 'NoneType' object has no attribute 'decode' when 'body' in match_on, fixed with 'raw_body'
When using vcr with the following configuration with 'body', there are errors with loading the JSON response -- it could be due to a blank response or blank payload. When I use 'raw_body' it works perfectly. Here's the stack trace (relevant sections):

```bash
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 473, in get
    return self.request('GET', url, **kwargs)
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 461, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 370, in send
    timeout=timeout
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 518, in urlopen
    body=body, headers=headers)
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 353, in _make_request
    httplib_response = conn.getresponse(buffering=True)
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/vcr/stubs/__init__.py", line 219, in getresponse
    if self.cassette.can_play_response_for(self._vcr_request):
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/vcr/cassette.py", line 232, in can_play_response_for
    return request and request in self and \
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/vcr/cassette.py", line 303, in __contains__
    for index, response in self._responses(request):
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/vcr/cassette.py", line 227, in _responses
    if requests_match(request, stored_request, self._match_on):
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/vcr/matchers.py", line 97, in requests_match
    matches = [(m(r1, r2), m) for m in matchers]
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/vcr/matchers.py", line 80, in body
    return transformer(read_body(r1)) == transformer(read_body(r2))
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/vcr/matchers.py", line 52, in _transform_json
    return json.loads(body.decode('utf-8'))
AttributeError: 'NoneType' object has no attribute 'decode'
```
diff --git a/tests/integration/test_requests.py b/tests/integration/test_requests.py
index 84a992b..804ab2e 100644
--- a/tests/integration/test_requests.py
+++ b/tests/integration/test_requests.py
@@ -38,6 +38,18 @@ def test_body(tmpdir, httpbin_both):
         assert content == requests.get(url).content
 
 
+def test_get_empty_content_type_json(tmpdir, httpbin_both):
+    '''Ensure GET with application/json content-type and empty request body doesn't crash'''
+    url = httpbin_both + '/status/200'
+    headers = {'Content-Type': 'application/json'}
+
+    with vcr.use_cassette(str(tmpdir.join('get_empty_json.yaml')), match_on=('body',)):
+        status = requests.get(url, headers=headers).status_code
+
+    with vcr.use_cassette(str(tmpdir.join('get_empty_json.yaml')), match_on=('body',)):
+        assert status == requests.get(url, headers=headers).status_code
+
+
 def test_effective_url(tmpdir, httpbin_both):
     '''Ensure that the effective_url is captured'''
     url = httpbin_both.url + '/redirect-to?url=/html'

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-httpbin requests httplib2 urllib3 tornado boto boto3 aiohttp
apt-get update apt-get install -y libyaml-dev
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aiohappyeyeballs==2.6.1
aiohttp==3.11.14
aiosignal==1.3.2
async-timeout==5.0.1
attrs==25.3.0
blinker==1.9.0
boto==2.49.0
boto3==1.37.23
botocore==1.37.23
brotlicffi==1.1.0.0
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
click==8.1.8
decorator==5.2.1
exceptiongroup==1.2.2
flasgger==0.9.7.1
Flask==3.1.0
frozenlist==1.5.0
greenlet==2.0.2
httpbin==0.10.2
httplib2==0.22.0
idna==3.10
importlib_metadata==8.6.1
iniconfig==2.1.0
itsdangerous==2.2.0
Jinja2==3.1.6
jmespath==1.0.1
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
MarkupSafe==3.0.2
mistune==3.1.3
multidict==6.2.0
packaging==24.2
pluggy==1.5.0
propcache==0.3.1
pycparser==2.22
pyparsing==3.2.3
pytest==8.3.5
pytest-httpbin==2.1.0
python-dateutil==2.9.0.post0
PyYAML==6.0.2
referencing==0.36.2
requests==2.32.3
rpds-py==0.24.0
s3transfer==0.11.4
six==1.17.0
tomli==2.2.1
tornado==6.4.2
typing_extensions==4.13.0
urllib3==1.26.20
-e git+https://github.com/kevin1024/vcrpy.git@ecbc192fc445d3bd91aba43d1a34dd6d9ccb1976#egg=vcrpy
Werkzeug==3.1.3
wrapt==1.17.2
yarl==1.18.3
zipp==3.21.0

name: vcrpy
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aiohappyeyeballs==2.6.1
      - aiohttp==3.11.14
      - aiosignal==1.3.2
      - async-timeout==5.0.1
      - attrs==25.3.0
      - blinker==1.9.0
      - boto==2.49.0
      - boto3==1.37.23
      - botocore==1.37.23
      - brotlicffi==1.1.0.0
      - certifi==2025.1.31
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - decorator==5.2.1
      - exceptiongroup==1.2.2
      - flasgger==0.9.7.1
      - flask==3.1.0
      - frozenlist==1.5.0
      - greenlet==2.0.2
      - httpbin==0.10.2
      - httplib2==0.22.0
      - idna==3.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - itsdangerous==2.2.0
      - jinja2==3.1.6
      - jmespath==1.0.1
      - jsonschema==4.23.0
      - jsonschema-specifications==2024.10.1
      - markupsafe==3.0.2
      - mistune==3.1.3
      - multidict==6.2.0
      - packaging==24.2
      - pluggy==1.5.0
      - propcache==0.3.1
      - pycparser==2.22
      - pyparsing==3.2.3
      - pytest==8.3.5
      - pytest-httpbin==2.1.0
      - python-dateutil==2.9.0.post0
      - pyyaml==6.0.2
      - referencing==0.36.2
      - requests==2.32.3
      - rpds-py==0.24.0
      - s3transfer==0.11.4
      - six==1.17.0
      - tomli==2.2.1
      - tornado==6.4.2
      - typing-extensions==4.13.0
      - urllib3==1.26.20
      - werkzeug==3.1.3
      - wrapt==1.17.2
      - yarl==1.18.3
      - zipp==3.21.0
prefix: /opt/conda/envs/vcrpy

tests/integration/test_requests.py::test_get_empty_content_type_json[http]
tests/integration/test_requests.py::test_status_code[https] tests/integration/test_requests.py::test_headers[https] tests/integration/test_requests.py::test_body[https] tests/integration/test_requests.py::test_get_empty_content_type_json[https] tests/integration/test_requests.py::test_effective_url[https] tests/integration/test_requests.py::test_auth[https] tests/integration/test_requests.py::test_auth_failed[https] tests/integration/test_requests.py::test_post[https] tests/integration/test_requests.py::test_post_chunked_binary[https] tests/integration/test_requests.py::test_redirects[https] tests/integration/test_requests.py::test_gzip[https] tests/integration/test_requests.py::test_session_created_before_use_cassette_is_patched[https] tests/integration/test_requests.py::test_nested_cassettes_with_session_created_before_nesting[https] tests/integration/test_requests.py::test_post_file[https] tests/integration/test_requests.py::test_filter_post_params[https] tests/integration/test_requests.py::test_cross_scheme
tests/integration/test_requests.py::test_status_code[http] tests/integration/test_requests.py::test_headers[http] tests/integration/test_requests.py::test_body[http] tests/integration/test_requests.py::test_effective_url[http] tests/integration/test_requests.py::test_auth[http] tests/integration/test_requests.py::test_auth_failed[http] tests/integration/test_requests.py::test_post[http] tests/integration/test_requests.py::test_post_chunked_binary[http] tests/integration/test_requests.py::test_redirects[http] tests/integration/test_requests.py::test_gzip[http] tests/integration/test_requests.py::test_session_created_before_use_cassette_is_patched[http] tests/integration/test_requests.py::test_nested_cassettes_with_session_created_before_nesting[http] tests/integration/test_requests.py::test_post_file[http] tests/integration/test_requests.py::test_filter_post_params[http] tests/integration/test_requests.py::test_session_and_connection_close tests/integration/test_requests.py::test_https_with_cert_validation_disabled tests/integration/test_requests.py::test_session_can_make_requests_after_requests_unpatched
vcr/matchers.py
vcr/matchers.py