# Vector3 serialization, deserialization bug

**URL:** <https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086>\
**Category:** Bugs\
**Created:** [January 13, 2026, 5:09am UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086 "2026-01-13T05:09:18Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![satguru](https://avatars.discourse-cdn.com/v4/letter/s/e480ec/32.png) [@satguru](https://forum.babylonjs.com/u/satguru)\
**Post date:** [January 13, 2026, 5:09am UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/1 "2026-01-13T05:09:18Z")

</div>

Serialization using JSON.stringify() stores Vector3 as something like  
{“\_isDirty”:true,“\_x”:1,“\_y”:2,“\_z”:3}  
Deserialization, using JSON.parse(), does not creat an instance of Vector3.  
see  
[https://playground.babylonjs.com/#R1F8YU#1561](https://playground.babylonjs.com/#R1F8YU#1561)

---

<div class="post-metadata">

**Author:** ![onekit](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/onekit/32/49527_2.png) [@onekit](https://forum.babylonjs.com/u/onekit)\
**Post date:** [January 13, 2026, 5:15am UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/2 "2026-01-13T05:15:43Z")

</div>

[https://playground.babylonjs.com/#R1F8YU#1563](https://playground.babylonjs.com/#R1F8YU#1563)

```TS
let vs = JSON.stringify(v);
console.log(vs);
let v2_data = JSON.parse(vs);
  
let v2 = new BABYLON.Vector3(v2_data.x, v2_data.y, v2_data.z); 
console.log(v2 instanceof BABYLON.Vector3);
let v3 = v2.add(v);
console.log(JSON.stringify(v3));

```

---

<div class="post-metadata">

**Author:** ![satguru](https://avatars.discourse-cdn.com/v4/letter/s/e480ec/32.png) [@satguru](https://forum.babylonjs.com/u/satguru)\
**Post date:** [January 13, 2026, 5:17am UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/3 "2026-01-13T05:17:14Z")

</div>

thats a workaround , not a soln.

---

<div class="post-metadata">

**Author:** ![onekit](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/onekit/32/49527_2.png) [@onekit](https://forum.babylonjs.com/u/onekit)\
**Post date:** [January 13, 2026, 5:28am UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/4 "2026-01-13T05:28:41Z")

</div>

**Proposal: Improve `Vector3` JSON Handling**

The issue users face with `v2.add is not a function` after `JSON.parse()` is a JavaScript feature, not a Babylon.js bug; `JSON.parse()` doesn’t restore class methods.

To provide a cleaner **solution** , I propose adding two methods to the **`BABYLON.Vector3`** class:

**1. `Parse(data)` Static Method**

Allows easy reconstruction of a `Vector3` from JSON data.

```javascript
/**
 * Creates a new BABYLON.Vector3 instance from data or JSON string.
 */
public static Parse(data: any): BABYLON.Vector3 {
    const parsedData = typeof data === 'string' ? JSON.parse(data) : data;
    const x = parsedData.x ?? parsedData._x;
    const y = parsedData.y ?? parsedData._y;
    const z = parsedData.z ?? parsedData._z;
    if ([x, y, z].includes(undefined)) throw new Error("Invalid Vector3 data.");
    return new BABYLON.Vector3(x, y, z);
}

```

**2. `toJSON()` Instance Method**

Ensures `JSON.stringify()` outputs clean properties (`{x, y, z}`).

```javascript
/**
 * Serializes the Vector3 instance into a clean JSON object.
 */
public toJSON(): any {
    return { x: this.x, y: this.y, z: this.z };
}

```

---

<div class="post-metadata">

**Author:** ![Joe\_Kerr](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/joe_kerr/32/39017_2.png) [@Joe\_Kerr](https://forum.babylonjs.com/u/Joe_Kerr)\
**Post date:** [January 13, 2026, 8:39am UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/5 "2026-01-13T08:39:21Z")

</div>

> [@satguru](#):
>
> thats a workaround , not a soln.

Yeah right, how dare they not fixing the stupid ECMA script specification that cannot handle Babylon data structures.

> [@onekit](#):
>
> Improve ``

You already have toArray and fromArray. Users have to manage de/serialization in their code anyway. So whether they call toJson / toArray does not seem to matter too much. Adding another toJson seems redundant. The Vector interface is quite big alredy.

---

<div class="post-metadata">

**Author:** ![onekit](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/onekit/32/49527_2.png) [@onekit](https://forum.babylonjs.com/u/onekit)\
**Post date:** [January 13, 2026, 8:52am UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/6 "2026-01-13T08:52:46Z")

</div>

> [@Joe\_Kerr](#):
>
> You already have toArray and fromArray. Users have to manage de/serialization in their code anyway. So whether they call toJson / toArray does not seem to matter too much. Adding another toJson seems redundant. The Vector interface is quite big alredy.

I agree with you. I was just suggesting a way to simplify life; I didn’t realize how widespread this problem is. I haven’t encountered it myself; I apply data to `Vector`s quite selectively.

💯 But the beauty of BabylonJS is that it is very compact, and we must try to keep it clean and simple.

---

<div class="post-metadata">

**Author:** ![Pryme8](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/pryme8/32/7212_2.png) [@Pryme8](https://forum.babylonjs.com/u/Pryme8)\
**Post date:** [January 13, 2026, 3:41pm UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/7 "2026-01-13T15:41:20Z")

</div>

Why would JSON.Parse return the class instance? It just turns strings into objects it does not instantiate anything.

> const stringV3 = JSON.stringify(new BABYLON.Vector3(1, 2, 3))  
> const parseV3 = (string) =\> {  
> const temp = JSON.parse(string)  
> return new BABYLON.Vector3(temp.\_x, temp.\_y, temp.\_z)  
> }  
> const v3 = parseV3(stringV3)

Just make a support function?

---

<div class="post-metadata">

**Author:** ![sebavan](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/sebavan/32/57_2.png) [@sebavan](https://forum.babylonjs.com/u/sebavan)\
**Post date:** [January 13, 2026, 7:28pm UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/8 "2026-01-13T19:28:59Z")

</div>

Why not relying on asArray and fromArray which is what we use in the babylon format for conciseness ?

---

<div class="post-metadata">

**Author:** ![qwiglydee](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/qwiglydee/32/47365_2.png) [@qwiglydee](https://forum.babylonjs.com/u/qwiglydee)\
**Post date:** [January 13, 2026, 10:29pm UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/9 "2026-01-13T22:29:16Z")

</div>

JSON is a standard library utility unaware of any babybylon structures or even its existance.

You need to use serialization and parsing facilities provided by babylon.  
They work for some big entities like meshes, transformnodes, gui controls and other stuff, but not for individual vectors.

However, vector properties of objects are serialized/parsed (as long as they are marked by `@serializable` in class definition)

[https://playground.babylonjs.com/?inspectorv2=true#8CRY28#1](https://playground.babylonjs.com/?inspectorv2=true#8CRY28#1)

---

<div class="post-metadata">

**Author:** ![satguru](https://avatars.discourse-cdn.com/v4/letter/s/e480ec/32.png) [@satguru](https://forum.babylonjs.com/u/satguru)\
**Post date:** [January 13, 2026, 11:35pm UTC](https://forum.babylonjs.com/t/vector3-serialization-deserialization-bug/62086/10 "2026-01-13T23:35:42Z")

</div>

What ! BabylonJS is not an ECMA standard !😁

On a serious note though, you guys are right.  
I did not think through this properly.

Thanks for weighing in.
