diff --git a/blocks_fonctions.php b/blocks_fonctions.php
index 35cf993079781e0084324fda3741855286aaf15f..ab8c648794f4b7d74efe9bfb650255e70c0c5b0e 100644
--- a/blocks_fonctions.php
+++ b/blocks_fonctions.php
@@ -12,3 +12,11 @@
 if (!defined('_ECRIRE_INC_VERSION')) {
 	return;
 }
+
+function blocks_serialize($data) {
+	return json_encode($data);
+}
+
+function blocks_deserialize($data) {
+	return json_decode($data ?? '', true);
+}
diff --git a/formulaires/editer_blocs_type_champs.php b/formulaires/editer_blocs_type_champs.php
index 0d322c2a12f7504972053977785ea7b799b10d3a..cb55ea0b0e6687da3dd3e79193a88efb2204d1d7 100644
--- a/formulaires/editer_blocs_type_champs.php
+++ b/formulaires/editer_blocs_type_champs.php
@@ -4,6 +4,8 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 	return;
 }
 
+include_spip('blocks_fonctions');
+
 function formulaires_editer_blocs_type_champs_charger($id_blocs_type, $redirect = '') {
 	$id_blocs_type = intval($id_blocs_type);
 	$contexte = [];
@@ -14,13 +16,13 @@ function formulaires_editer_blocs_type_champs_charger($id_blocs_type, $redirect
 		and $blocs_type = sql_fetsel('*', 'spip_blocs_types', 'id_blocs_type = ' . $id_blocs_type)
 		and autoriser('editer', 'blocs_type', $id_blocs_type)
 	) {
-		$saisies = json_decode($blocs_type['saisies'], true);
+		$saisies = blocks_deserialize($blocs_type['saisies']);
 
 		// Est-ce qu'on restaure une révision ?
 		if ($id_version = _request('id_version')) {
 			include_spip('inc/revisions');
 			$old = recuperer_version($id_blocs_type, 'blocs_type', $id_version);
-			$saisies = json_decode($old['saisies'], true);
+			$saisies = blocks_deserialize($old['saisies']);
 		}
 		if (!is_array($saisies)) {
 			$saisies = [];
@@ -62,7 +64,7 @@ function formulaires_editer_blocs_type_champs_verifier($id_blocs_type, $redirect
 		// Attention à s'assurer que tout les elements du tableau soit bien soit des tableaux, soit un string
 		// En effet, le md5 du formulaire_initial est calculé à partir de ce qui est passé au squelette
 		// Or dès qu'une valeur est passée à un squelette, elle est changé en string, à cause du mode de compilation (?)
-		$saisies_anciennes = json_decode($saisies_anciennes, true);
+		$saisies_anciennes = blocks_deserialize($saisies_anciennes);
 		$saisies_anciennes_str = $saisies_anciennes;
 		array_walk_recursive($saisies_anciennes_str, 'blocs_types_array_walk_recursive_strval');
 		$md5_saisies_anciennes = md5(serialize($saisies_anciennes_str));
@@ -118,7 +120,7 @@ function formulaires_editer_blocs_type_champs_traiter($id_blocs_type, $redirect
 
 		// On envoie les nouvelles dans la table
 		include_spip('action/editer_objet');
-		$err = objet_modifier('blocs_type', $id_blocs_type, ['saisies' => json_encode(saisies_identifier($saisies_nouvelles))]);
+		$err = objet_modifier('blocs_type', $id_blocs_type, ['saisies' => blocks_serialize(saisies_identifier($saisies_nouvelles))]);
 
 		// Si c'est bon on reinitialise les sessions
 		if (!$err) {
diff --git a/prive/objets/contenu/blocs_type.html b/prive/objets/contenu/blocs_type.html
index 127b65e86e50fb2461b74e3ea9a87d272d4336b4..dbd5f14517f27f0a9e9bb98fb18caa71ffe2b472 100644
--- a/prive/objets/contenu/blocs_type.html
+++ b/prive/objets/contenu/blocs_type.html
@@ -4,7 +4,7 @@
 	<span dir="#LANG_DIR" class="#EDIT{titre} titre">(#TITRE)</span>
 </div>]
 
-#SET{saisies, #SAISIES|json_decode{1}}
+#SET{saisies, #SAISIES|blocks_deserialize{1}}
 [(#GET{saisies}|oui)
 	<h2><:blocs_type:champ_saisies_label:/></h2>
 	<div class="formulaire_spip">