diff --git a/bilby/core/result.py b/bilby/core/result.py
index 072d1e52ddbc807d62f91aa70893595d4583dd1c..c265e7803c71d24a0ef7d376794929dc032d9af6 100644
--- a/bilby/core/result.py
+++ b/bilby/core/result.py
@@ -20,6 +20,7 @@ from .utils import (
     decode_bilby_json, docstring,
     recursively_save_dict_contents_to_group,
     recursively_load_dict_contents_from_group,
+    recursively_decode_bilby_json,
 )
 from .prior import Prior, PriorDict, DeltaFunction
 
@@ -560,6 +561,17 @@ class Result(object):
         else:
             return ''
 
+    @property
+    def meta_data(self):
+        return self._meta_data
+
+    @meta_data.setter
+    def meta_data(self, meta_data):
+        if meta_data is None:
+            meta_data = dict()
+        meta_data = recursively_decode_bilby_json(meta_data)
+        self._meta_data = meta_data
+
     @property
     def priors(self):
         if self._priors is not None:
diff --git a/bilby/core/utils.py b/bilby/core/utils.py
index fd0c558ed160f56ebe75545897c923f57f1dabf1..53196de80e1ccc66753abc946c39b46a16c61a67 100644
--- a/bilby/core/utils.py
+++ b/bilby/core/utils.py
@@ -1108,6 +1108,28 @@ def decode_astropy_quantity(dct):
         return dct
 
 
+def recursively_decode_bilby_json(dct):
+    """
+    Recursively call `bilby_decode_json`
+
+    Parameters
+    ----------
+    dct: dict
+        The dictionary to decode
+
+    Returns
+    -------
+    dct: dict
+        The original dictionary with all the elements decode if possible
+    """
+    dct = decode_bilby_json(dct)
+    if isinstance(dct, dict):
+        for key in dct:
+            if isinstance(dct[key], dict):
+                dct[key] = recursively_decode_bilby_json(dct[key])
+    return dct
+
+
 def reflect(u):
     """
     Iteratively reflect a number until it is contained in [0, 1].
@@ -1307,10 +1329,14 @@ def decode_from_hdf5(item):
     elif isinstance(item, (bytes, bytearray)):
         output = item.decode()
     elif isinstance(item, np.ndarray):
-        if "|S" in str(item.dtype) or isinstance(item[0], bytes):
+        if item.size == 0:
+            output = item
+        elif "|S" in str(item.dtype) or isinstance(item[0], bytes):
             output = [it.decode() for it in item]
         else:
             output = item
+    elif isinstance(item, np.bool_):
+        output = bool(item)
     else:
         output = item
     return output
@@ -1364,9 +1390,11 @@ def encode_for_hdf5(item):
     elif isinstance(item, pd.Series):
         output = item.to_dict()
     elif inspect.isfunction(item) or inspect.isclass(item):
-        output = dict(__module__=item.__module__, __name__=item.__name__)
+        output = dict(__module__=item.__module__, __name__=item.__name__, __class__=True)
     elif isinstance(item, dict):
         output = item.copy()
+    elif isinstance(item, tuple):
+        output = {str(ii): elem for ii, elem in enumerate(item)}
     else:
         raise ValueError(f'Cannot save {type(item)} type')
     return output