diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/ArrayNode.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/ArrayNode.jsx
new file mode 100644
index 0000000000..f9a0acf5ef
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/ArrayNode.jsx
@@ -0,0 +1,11 @@
+import React from 'react';
+
+const ArrayNode = ({ value }) => {
+ return (
+
+ {`[${value.length}]`}
+
+ );
+};
+
+export default ArrayNode;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/BooleanNode.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/BooleanNode.jsx
new file mode 100644
index 0000000000..d692a9c10c
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/BooleanNode.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import OverflowTooltip from '@/_components/OverflowTooltip';
+
+const BooleanNode = ({ value }) => {
+ return (
+
+ {value.toString()}
+
+ );
+};
+
+export default BooleanNode;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/FunctionNode.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/FunctionNode.jsx
new file mode 100644
index 0000000000..456b8238c4
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/FunctionNode.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import OverflowTooltip from '@/_components/OverflowTooltip';
+
+const FunctionNode = () => {
+ return (
+
+ function
+
+ );
+};
+
+export default FunctionNode;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/NullNode.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/NullNode.jsx
new file mode 100644
index 0000000000..40ff32737a
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/NullNode.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import OverflowTooltip from '@/_components/OverflowTooltip';
+
+const NullNode = ({ value }) => {
+ return (
+
+ {value === null ? 'null' : 'undefined'}
+
+ );
+};
+
+export default NullNode;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/NumberNode.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/NumberNode.jsx
new file mode 100644
index 0000000000..8eb6e981b9
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/NumberNode.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import OverflowTooltip from '@/_components/OverflowTooltip';
+
+const NumberNode = ({ value }) => {
+ return (
+
+ {value}
+
+ );
+};
+
+export default NumberNode;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/ObjectNode.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/ObjectNode.jsx
new file mode 100644
index 0000000000..e89082cbd1
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/ObjectNode.jsx
@@ -0,0 +1,11 @@
+import React from 'react';
+
+const ObjectNode = ({ value }) => {
+ return (
+
+ {`{${Object.keys(value).length}}`}
+
+ );
+};
+
+export default ObjectNode;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/Row.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/Row.jsx
new file mode 100644
index 0000000000..ed5ef5a10c
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/Row.jsx
@@ -0,0 +1,123 @@
+import React, { useState } from 'react';
+import StringNode from './StringNode';
+import FunctionNode from './FunctionNode';
+import NumberNode from './NumberNode';
+import BooleanNode from './BooleanNode';
+import NullNode from './NullNode';
+import ArrayNode from './ArrayNode';
+import ObjectNode from './ObjectNode';
+import SolidIcon from '@/_ui/Icon/SolidIcons';
+import { ToolTip } from '@/_components/ToolTip';
+import { DefaultCopyIcon } from '../../DefaultCopyIcon';
+import { copyToClipboard } from '../../utils';
+
+const Row = ({ label, value, level = 1, absolutePath }) => {
+ const [isExpanded, setIsExpanded] = useState(false);
+ const Node = () => {
+ if (typeof value === 'string') {
+ return ;
+ } else if (typeof value === 'undefined' || value === null) {
+ return ;
+ } else if (typeof value === 'number') {
+ return ;
+ } else if (typeof value === 'boolean') {
+ return ;
+ } else if (Array.isArray(value)) {
+ return ;
+ } else if (typeof value === 'object') {
+ return ;
+ } else if (typeof value === 'function') {
+ return ;
+ }
+ };
+
+ const isObject = typeof value === 'object' && !Array.isArray(value) && value !== null;
+ const isArray = Array.isArray(value);
+
+ return (
+
+
1 ? '8px' : '0px' }}>
+
setIsExpanded((prev) => !prev)}>
+
+ {(isArray || isObject) &&
+ (isExpanded ? (
+
+ ) : (
+
+ ))}
+
+
+ {label}
+
+
+
+
+
+
+ {
+ copyToClipboard(absolutePath);
+ }}
+ className="copy-to-clipboard json-viewer-action-icon"
+ >
+
+
+
+
+ {
+ copyToClipboard(value);
+ }}
+ className="json-viewer-action-icon"
+ >
+
+
+
+
+
+
+ {isExpanded && isObject && (
+
+ {Object.entries(value).map(([key, val]) => (
+
+ ))}
+
+ )}
+ {isExpanded && isArray && (
+
+ {value.map((item, index) => {
+ return (
+
+ );
+ })}
+
+ )}
+
+ );
+};
+
+export default Row;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/StringNode.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/StringNode.jsx
new file mode 100644
index 0000000000..3c4bcc3644
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/Components/StringNode.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import OverflowTooltip from '@/_components/OverflowTooltip';
+
+const StringNode = ({ value }) => {
+ return (
+
+ {`"${value}"`}
+
+ );
+};
+
+export default StringNode;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/CustomJSONViewer.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/CustomJSONViewer.jsx
new file mode 100644
index 0000000000..b5e392ee66
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/CustomJSONViewer.jsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import Row from './Components/Row';
+import './styles.scss';
+
+const CustomJSONViewer = ({ data, absolutePath }) => {
+ let modifiedData = data;
+ if (typeof data !== 'object') modifiedData = { '': data };
+ return (
+
+ {Object.entries(modifiedData).map(([key, value], index) => {
+ return
;
+ })}
+
+ );
+};
+
+export default CustomJSONViewer;
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/styles.scss b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/styles.scss
new file mode 100644
index 0000000000..62a2adb902
--- /dev/null
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/CustomJSONViewer/styles.scss
@@ -0,0 +1,74 @@
+.custom-json-viewer {
+ margin-left: 16px;
+ margin-right: 16px;
+ font-family: "IBM Plex Sans";
+ font-size: 12px;
+ color: var(--text-default, #1B1F24);
+
+
+ .json-viewer-row-container {
+ &:hover {
+ background-color: var(--interactive-overlays-fill-hover);
+
+ .json-viewer-actions-container {
+ display: flex;
+ }
+ }
+ }
+
+ .json-viewer-row {
+ width: 100%;
+ display: flex;
+ height: 20px;
+ align-items: center;
+ overflow: hidden;
+
+ .json-viewer-expand-icon {
+ width: 12px;
+ height: 12px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .json-viewer-label-container {
+ margin-left: 8px;
+ margin-right: 4px;
+ flex-shrink: 0; /* don’t shrink */
+ white-space: nowrap;
+ }
+
+ .json-viewer-value-container {
+ flex: 1; /* take available space */
+ min-width: 0; /* allow shrinkage */
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .json-viewer-actions-container {
+ display:none;
+ margin-left: auto;
+ margin-right: 4px;
+ height: 12px;
+ width:40px;
+ align-items: center;
+ flex-shrink: 0;
+
+ .json-viewer-action-icon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 20px;
+ width: 20px;
+
+ &:hover {
+ cursor: pointer;
+ background-color: var(--button-outline-hover);
+ border-radius: 4px;
+ }
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/DefaultCopyIcon.jsx b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/DefaultCopyIcon.jsx
index fa46cf9694..6d26f2676b 100644
--- a/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/DefaultCopyIcon.jsx
+++ b/frontend/src/AppBuilder/LeftSidebar/LeftSidebarInspector/DefaultCopyIcon.jsx
@@ -1,9 +1,9 @@
import React from 'react';
-export const DefaultCopyIcon = () => (
+export const DefaultCopyIcon = ({ height = 12, width = 12 }) => (