@@ -23,14 +23,15 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2323
2424</editor-fold> */
2525
26+ #include < vsg/core/Objects.h>
2627#include < vsg/io/ReaderWriter.h>
2728#include < vsg/io/mem_stream.h>
2829
2930namespace vsg
3031{
3132
3233 // / JSON parser based on spec: https://www.json.org/json-en.html
33- struct JSONParser
34+ struct VSG_DECLSPEC JSONParser
3435 {
3536 std::string buffer;
3637 std::size_t pos = 0 ;
@@ -44,13 +45,69 @@ namespace vsg
4445 return (c == ' ' || c == ' \t ' || c == ' \r ' || c == ' \n ' );
4546 }
4647
48+ struct Schema
49+ {
50+ // array elements [ value, value.. ]
51+ virtual void read_array (JSONParser& parser);
52+ virtual void read_object (JSONParser& parser);
53+ virtual void read_string (JSONParser& parser);
54+ virtual void read_number (JSONParser& parser, std::istream& input);
55+ virtual void read_bool (JSONParser& parser, bool value);
56+ virtual void read_null (JSONParser& parser);
57+
58+ // object properties { name, value; ... }
59+ virtual void read_array (JSONParser& parser, const std::string_view& name);
60+ virtual void read_object (JSONParser& parser, const std::string_view& name);
61+ virtual void read_string (JSONParser& parser, const std::string_view& name);
62+ virtual void read_number (JSONParser& parser, const std::string_view& name, std::istream& input);
63+ virtual void read_bool (JSONParser& parser, const std::string_view& name, bool value);
64+ virtual void read_null (JSONParser& parser, const std::string_view& name);
65+ };
66+
4767 bool read_string (std::string& value);
68+ void read_object (Schema& schema);
69+ void read_array (Schema& schema);
4870
49- vsg::ref_ptr<vsg::Object> read_array ();
50- vsg::ref_ptr<vsg::Object> read_object ();
71+ template <typename ... Args>
72+ void warning (Args&&... args)
73+ {
74+ vsg::warn (" Parsing error at pos = " , pos, " . " , std::forward<Args>(args)...);
75+ }
5176 };
5277 VSG_type_name (vsg::JSONParser);
5378
79+ // / Default support for mapping standard JSON types directly to VSG.
80+ // / JSON objects are mapped to vsg::Object metadata.
81+ // / JSON arrays to vsg::Objects.
82+ // / string, number and bool are mapped to stringValue, doubleValue and boolValue.
83+ struct VSG_DECLSPEC JSONtoMetaDataSchema : public JSONParser::Schema
84+ {
85+ // object created when parsing JSON file
86+ vsg::ref_ptr<vsg::Object> object;
87+ vsg::ref_ptr<vsg::Objects> objects;
88+
89+ void addToArray (vsg::ref_ptr<vsg::Object> in_object);
90+ void addToObject (const std::string_view& name, vsg::ref_ptr<vsg::Object> in_object);
91+
92+ // array elements [ value, value.. ]
93+ void read_array (JSONParser& parser) override ;
94+ void read_object (JSONParser& parser) override ;
95+ void read_string (JSONParser& parser) override ;
96+ void read_number (JSONParser& parser, std::istream& input) override ;
97+ void read_bool (JSONParser& parser, bool value) override ;
98+ void read_null (JSONParser& parser) override ;
99+
100+ // object properties { name, value; ... }
101+ void read_array (JSONParser& parser, const std::string_view& name) override ;
102+ void read_object (JSONParser& parser, const std::string_view& name) override ;
103+ void read_string (JSONParser& parser, const std::string_view& name) override ;
104+ void read_number (JSONParser& parser, const std::string_view& name, std::istream& input) override ;
105+ void read_bool (JSONParser& parser, const std::string_view& name, bool value) override ;
106+ void read_null (JSONParser& parser, const std::string_view& name) override ;
107+ };
108+ VSG_type_name (vsg::JSONtoMetaDataSchema);
109+
110+
54111 // / json ReaderWriter
55112 class json : public vsg ::Inherit<vsg::ReaderWriter, json>
56113 {
0 commit comments