From b9abc1886f7b91a45b7a49157c894d35d5d65669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Fri, 17 Sep 2021 19:37:20 +0200 Subject: [PATCH] dish: properly serialize Javascript Maps as JSON When decoding CBOR it may happen that a Map is returned instead of an object when the keys are not all strings. Encode such Maps as array of key-value-pairs. --- src/core/dishTypes/DishJSON.mjs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/core/dishTypes/DishJSON.mjs b/src/core/dishTypes/DishJSON.mjs index 703b0980..53bdaaf4 100644 --- a/src/core/dishTypes/DishJSON.mjs +++ b/src/core/dishTypes/DishJSON.mjs @@ -7,6 +7,17 @@ import DishType from "./DishType.mjs"; import Utils from "../Utils.mjs"; +/** + * Serialize Maps which are not natively compatible with JSON as an array of + * key-value-paris. + */ +function jsonStringifyReplacer(k, v) { + if (v instanceof Map) { + return [...v]; + } + return v; +} + /** * Translation methods for JSON dishes */ @@ -17,7 +28,7 @@ class DishJSON extends DishType { */ static toArrayBuffer() { DishJSON.checkForValue(this.value); - this.value = this.value !== undefined ? Utils.strToArrayBuffer(JSON.stringify(this.value, null, 4)) : new ArrayBuffer; + this.value = this.value !== undefined ? Utils.strToArrayBuffer(JSON.stringify(this.value, jsonStringifyReplacer, 4)) : new ArrayBuffer; } /**