allow "stringified" nested objects and arrays as feature property

This commit is contained in:
artemp 2015-02-04 18:23:43 +01:00
parent 6beee4ad68
commit 671c0046ee
3 changed files with 16 additions and 6 deletions

View file

@ -104,7 +104,9 @@ struct feature_grammar :
qi::rule<Iterator,void(FeatureType &),space_type> properties; qi::rule<Iterator,void(FeatureType &),space_type> properties;
qi::rule<Iterator,qi::locals<std::string>, void(FeatureType &),space_type> attributes; qi::rule<Iterator,qi::locals<std::string>, void(FeatureType &),space_type> attributes;
qi::rule<Iterator, json_value(), space_type> attribute_value; qi::rule<Iterator, json_value(), space_type> attribute_value;
qi::rule<Iterator, qi::locals<std::int32_t>, std::string(), space_type> stringify_object;
qi::rule<Iterator, qi::locals<std::int32_t>, std::string(), space_type> stringify_array;
// functions
phoenix::function<put_property> put_property_; phoenix::function<put_property> put_property_;
phoenix::function<extract_geometry> extract_geometry_; phoenix::function<extract_geometry> extract_geometry_;
// error handler // error handler

View file

@ -43,15 +43,14 @@ feature_grammar<Iterator,FeatureType,ErrorHandler>::feature_grammar(mapnik::tran
qi::_a_type _a; qi::_a_type _a;
qi::_r1_type _r1; qi::_r1_type _r1;
qi::eps_type eps; qi::eps_type eps;
qi::char_type char_;
using qi::fail; using qi::fail;
using qi::on_error; using qi::on_error;
using phoenix::new_; using phoenix::new_;
using phoenix::construct; using phoenix::construct;
// generic json types // generic json types
json_.value = json_.object | json_.array | json_.string_ json_.value = json_.object | json_.array | json_.string_ | json_.number
| json_.number
; ;
json_.pairs = json_.key_value % lit(',') json_.pairs = json_.key_value % lit(',')
@ -94,7 +93,14 @@ feature_grammar<Iterator,FeatureType,ErrorHandler>::feature_grammar(mapnik::tran
attributes = (json_.string_ [_a = _1] > lit(':') > attribute_value [put_property_(_r1,_a,_1)]) % lit(',') attributes = (json_.string_ [_a = _1] > lit(':') > attribute_value [put_property_(_r1,_a,_1)]) % lit(',')
; ;
attribute_value %= json_.number | json_.string_ ; attribute_value %= json_.number | json_.string_ | stringify_object | stringify_array
;
stringify_object %= char_('{')[_a = 1 ] >> *(eps(_a > 0) >> (char_('{')[_a +=1] | char_('}')[_a -=1] | char_))
;
stringify_array %= char_('[')[_a = 1 ] >> *(eps(_a > 0) >> (char_('[')[_a +=1] | char_(']')[_a -=1] | char_))
;
feature.name("Feature"); feature.name("Feature");
feature_type.name("type"); feature_type.name("type");

View file

@ -21,7 +21,9 @@
"spaces":"this has spaces", "spaces":"this has spaces",
"double":1.1, "double":1.1,
"boolean":true, "boolean":true,
"NOM_FR":"Québec" "NOM_FR":"Québec",
"object": {"value":{"type":"u'\u041c\u0430pni\u043a'","array": [3,0,"x"]}},
"array" : [ [ [1], ["deux"]],[[3,"four","\u4e94"]]]
} }
} }
] ]