Repository: khronosgroup/gltf-blender-io
Issue: Fail to export with "gather_gltf_hook" of gltf2ExportUserExtension.

**Describe the bug**
Fail to export with "gather_gltf_hook" of gltf2ExportUserExtension.
It can be happend the dict by [exporter.glTF.to_dict()](https://github.com/KhronosGroup/glTF-Blender-IO/blob/8f41a73e442c3cf10ac4f605e1fc962927f421ee/addons/io_scene_gltf2/blender/exp/gltf2_blender_export.py#L66)


**To Reproduce**
I duplicated [example_gltf_extension](https://github.com/KhronosGroup/glTF-Blender-IO/tree/master/example-addons/example_gltf_extension)  
And I added the code below "gather_node_hook".
```
    def gather_gltf_hook(self, gltf2_plan, export_settings):
        if self.properties.enabled:
            if gltf2_plan.extensions is None:
                gltf2_plan.extensions = {}
            gltf2_plan.extensions[glTF_extension_name] = self.Extension(
                name=glTF_extension_name,
                extension={"float": self.properties.float_property},
                required=extension_is_required
            )
```
This is the result.
```
05:19:51 | INFO: Starting glTF 2.0 export
05:19:51 | INFO: Extracting primitive: Cube
05:19:51 | INFO: Primitives created: 1
gather_gltf_hook fails on <vrm_exporter.glTF2ExportUserExtension object at 0x000002E821960288>
'dict' object has no attribute 'extensions'
05:19:51 | INFO: Finished glTF 2.0 export in 0.0039997100830078125 s

{'asset': {'generator': 'Khronos glTF Blender I/O v1.5.17', 'version': '2.0'}, 'scene': 0, 'scenes': [{'name': 'Scene', 'nodes': [0, 1, 2]}], 'nodes': [{'mesh': 0, 'name': 'Cube'}, {'name': 'Light', 'rotation': [0.16907575726509094, 0.7558803558349609, -0.27217137813568115, 0.570947527885437], 'translation': [4.076245307922363, 5.903861999511719, -1.0054539442062378]}, {'name': 'Camera', 'rotation': [0.483536034822464, 0.33687159419059753, -0.20870360732078552, 0.7804827094078064], 'translation': [7.358891487121582, 4.958309173583984, 6.925790786743164]}], 'materials': [{'doubleSided': True, 'name': 'Material', 'pbrMetallicRoughness': {'baseColorFactor': [0.800000011920929, 0.800000011920929, 0.800000011920929, 1], 'metallicFactor': 0, 'roughnessFactor': 0.4000000059604645}}], 'meshes': [{'name': 'Cube', 'primitives': [{'attributes': {'POSITION': 0, 'NORMAL': 1, 'TEXCOORD_0': 2}, 'indices': 3, 'material': 0}]}], 'accessors': [{'bufferView': 0, 'componentType': 5126, 'count': 24, 'max': [1, 1, 1], 'min': [-1, -1, -1], 'type': 'VEC3'}, {'bufferView': 1, 'componentType': 5126, 'count': 24, 'type': 'VEC3'}, {'bufferView': 2, 'componentType': 5126, 'count': 24, 'type': 'VEC2'}, {'bufferView': 3, 'componentType': 5123, 'count': 36, 'type': 'SCALAR'}], 'bufferViews': [{'buffer': 0, 'byteLength': 288, 'byteOffset': 0}, {'buffer': 0, 'byteLength': 288, 'byteOffset': 288}, {'buffer': 0, 'byteLength': 192, 'byteOffset': 576}, {'buffer': 0, 'byteLength': 72, 'byteOffset': 768}], 'buffers': [{'byteLength': 840}]}
```
**Expected behavior**
If it succeed, the GLB's JSON will have "extensionsUsed" and "extensions" keys.

**Version**
 - Windows 10
 - Blender Version 2.92

Changed files:
addons/io_scene_gltf2/blender/exp/gltf2_blender_export.py

diff --git a/addons/io_scene_gltf2/blender/exp/gltf2_blender_export.py b/addons/io_scene_gltf2/blender/exp/gltf2_blender_export.py
index ce2b9721..5cb98479 100644
--- a/addons/io_scene_gltf2/blender/exp/gltf2_blender_export.py
+++ b/addons/io_scene_gltf2/blender/exp/gltf2_blender_export.py
@@ -63,11 +63,13 @@ def __export(export_settings):
     __gather_gltf(exporter, export_settings)
     buffer = __create_buffer(exporter, export_settings)
     exporter.finalize_images()
-    json = __fix_json(exporter.glTF.to_dict())
 
     export_user_extensions('gather_gltf_hook', export_settings, exporter.glTF)
     exporter.traverse_extensions()
 
+    # now that addons possibly add some fields in json, we can fix in needed
+    json = __fix_json(exporter.glTF.to_dict())
+
     return json, buffer