JD – JSON Declaration Language
I’ve just added a new module called bm_jd to the pybm project. It implements a “little language” for declaring information, like a configuration file, when the details are all specified in JSON.
The language is very simple, consisting of semi-colon terminated statements; each statement having a command and zero or more arguments. Each argument may or may not have JSON data – if it does, it will be set off with a colon.
The BNF looks like this:
<document> ::= <statement>*
<statement> ::= <command> ( <word> | <word>:<json> )*
<command>|<word> ::= [a-zA-Z0-9_]
<json> ::= ... any valid JSON data ...
You can use the pybm JD parser in several ways:
- implement a subclass of
JDParser, definingCustomizeProduce; or - implement a subclass of
DispatchJDParser, defining acall_<command>method for each command you plan to allow
In either case, you call a method FeedString to get the parser rolling.
There’s also a LogJDParser, which just dumps parsing results. Here’s an example of a JD document. Don’t worry about Djolt code in the JSON, that’s just text as far as this example is concerned:
read_template from:"fire_body" render:false;
map from:"fire.GetGeocodeIndidents" to:"incidents" map:{
"latitude" : "{{ latitude }}",
"longitude" : "{{ longitude }}",
"title" : "{{ AlarmLevel}}: {{ IncidentType }} on {{ RawStreet }}",
"uri" : "{{ HOME_URI }}#{{ IncidentNumber }}",
"body" : "{{ *fire_body|safe }}",
"IncidentNumber" : "{{ IncidentNumber }}"
};
read_template from:"gmaps" items:"incidents" meta:{
"id" : "maps",
"latitude" : 43.67,
"longitude" : -79.38,
"uzoom" : -13,
"gzoom" : 13,
"api_key" : "{{ cfg.gmaps.api_key|otherwise:'_' }}",
"html" : {
"width" : "1024px",
"height" : "800px"
}
};