Skip to content

Commit 9aabb94

Browse files
committed
Added support for customizing the parsing of json files.
1 parent 2423e53 commit 9aabb94

2 files changed

Lines changed: 335 additions & 120 deletions

File tree

include/vsg/io/json.h

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2930
namespace 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

Comments
 (0)