diff --git a/src/Frontend/package-lock.json b/src/Frontend/package-lock.json index fba179abb..e44df8a15 100644 --- a/src/Frontend/package-lock.json +++ b/src/Frontend/package-lock.json @@ -14,6 +14,7 @@ "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", "highlight.js": "^11.10.0", + "lossless-json": "^4.0.2", "memoize-one": "^6.0.0", "moment": "^2.30.1", "pinia": "^2.2.8", @@ -4697,6 +4698,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lossless-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lossless-json/-/lossless-json-4.0.2.tgz", + "integrity": "sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA==" + }, "node_modules/loupe": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", diff --git a/src/Frontend/package.json b/src/Frontend/package.json index 12616f851..961a6f6c1 100644 --- a/src/Frontend/package.json +++ b/src/Frontend/package.json @@ -23,6 +23,7 @@ "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", "highlight.js": "^11.10.0", + "lossless-json": "^4.0.2", "memoize-one": "^6.0.0", "moment": "^2.30.1", "pinia": "^2.2.8", diff --git a/src/Frontend/src/components/failedmessages/MessageView.vue b/src/Frontend/src/components/failedmessages/MessageView.vue index 7c32459a5..5ffc771e6 100644 --- a/src/Frontend/src/components/failedmessages/MessageView.vue +++ b/src/Frontend/src/components/failedmessages/MessageView.vue @@ -17,6 +17,7 @@ import { TYPE } from "vue-toastification"; import { ExtendedFailedMessage, FailedMessageError, FailedMessageStatus, isError } from "@/resources/FailedMessage"; import Message from "@/resources/Message"; import { NServiceBusHeaders } from "@/resources/Header"; +import { parse, stringify } from "lossless-json"; let refreshInterval: number | undefined; let pollingFaster = false; @@ -154,8 +155,8 @@ async function downloadBody(message: ExtendedFailedMessage) { try { switch (response.headers.get("content-type")) { case "application/json": { - let jsonBody = await response.json(); - jsonBody = JSON.parse(JSON.stringify(jsonBody).replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => (g ? "" : m))); + const jsonBodyRaw = await response.text(); + const jsonBody = parse(jsonBodyRaw.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => (g ? "" : m))); message.messageBody = formatJson(jsonBody); return; } @@ -260,8 +261,8 @@ function formatXml(xml: string) { return string.trim(); } -function formatJson(json: string) { - return JSON.stringify(json, null, 2); +function formatJson(json: unknown) { + return stringify(json, null, 2) as string; } function togglePanel(panelNum: number) {