diff --git a/youtube_dl/FileDownloader.py b/youtube_dl/FileDownloader.py
index e8c62ce07..be70ec755 100644
--- a/youtube_dl/FileDownloader.py
+++ b/youtube_dl/FileDownloader.py
@@ -454,9 +454,8 @@ class FileDownloader(object):
                 self.trouble(u'ERROR: No JSON encoder found. Update to Python 2.6+, setup a json module, or leave out --write-info-json.')
                 return
             try:
-                with io.open(encodeFilename(infofn), 'w', 'utf-8') as infof:
-                    json_info_dict = dict((k, v) for k,v in info_dict.items() if not k in ['urlhandle'])
-                    json.dump(json_info_dict, infof)
+                json_info_dict = dict((k, v) for k,v in info_dict.items() if not k in ['urlhandle'])
+                write_json_file(json_info_dict, encodeFilename(infofn))
             except (OSError, IOError):
                 self.trouble(u'ERROR: Cannot write metadata to JSON file ' + infofn)
                 return
diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py
index 25b67db06..4e64f327a 100644
--- a/youtube_dl/utils.py
+++ b/youtube_dl/utils.py
@@ -3,6 +3,7 @@
 
 import gzip
 import io
+import json
 import locale
 import os
 import re
@@ -175,6 +176,18 @@ else:
         assert type(s) == type(u'')
         print(s)
 
+# In Python 2.x, json.dump expects a bytestream.
+# In Python 3.x, it writes to a character stream
+if sys.version_info < (3,0):
+    def write_json_file(obj, fn):
+        with open(fn, 'wb') as f:
+            json.dump(obj, f)
+else:
+    def write_json_file(obj, fn):
+        with open(fn, 'w', encoding='utf-8') as f:
+            json.dump(obj, f)
+
+
 def htmlentity_transform(matchobj):
     """Transforms an HTML entity to a character.