Home

Awesome

JSON parser for CMake

Module JSONParser.cmake contains macro sbeParseJson to parse JSON string stored in given variable (second argument). Macro fills given variable (first argument) with list of all names in JSON string. For each name it creates variable and sets the value from JSON string. To clear created variables use macro sbeClearJson.

Module does not validate given JSON string. If given JSON is malformed, the macro gives unpredictable result.

Example

JSON to parse:

{"menu": {
    "header": "SVG Viewer",
    "items": [
        {"id": "Open"},
        {"id": "OpenOld", "label": null },
        {"id": "OpenNew", "label": "Open New"},
        null,
        {"id": "ZoomIn", "label": ["Zoom In", "Zoom At"] },
        {"id": "ZoomOut", 
               "label": 
	         { 
	         "short": ["zo", "zout"], 
	         "long":"Zoom Out"
	         }
    	},
        {"id": "OriginalView", "label": "Original View"},
    	null
     ],
    "elements" : ["one", "two", { "number":"three", "Desc": "Number" }, null ]
}}

Let assume that above JSON is stored in variable jsonTest in CMake script. It can be parsed with following lines of code.

include(JSONParser.cmake)

# name of variable not string itself is passed to macro sbeParseJson
sbeParseJson(example jsonTest)

# Now you can use parsed variables.
foreach(var ${example})
    message("${var} = ${${var}}")
endforeach()

# when you want to access concrete JSON object, use the names in JSON, the array indexes for JSON object MUST be given after '_'
# e.g if you want to store value of object 'id' of first element of array 'items' in object 'menu'
set(FirstItemId ${example.menu.items_0.id})
# e.g if you want to store 1-th element of array 'short' in object 'label' of 5-th element of array items in object menu 
set(ShortLabel ${example.menu.items_5.label.short_0})

# When you are done, clean parsed variables
sbeClearJson(example)

Macro sbeParseJson creates following variables and its values (variable name = value).

example.menu.header = SVG Viewer
example.menu.items = 0;1;2;3;4;5;6;7
example.menu.items_0.id = Open
example.menu.items_1.id = OpenOld
example.menu.items_1.label = null
example.menu.items_2.id = OpenNew
example.menu.items_2.label = Open New
example.menu.items_3 = null
example.menu.items_4.id = ZoomIn
example.menu.items_4.label = 0;1
example.menu.items_4.label_0 = Zoom In
example.menu.items_4.label_1 = Zoom At
example.menu.items_5.id = ZoomOut
example.menu.items_5.label.short = 0;1
example.menu.items_5.label.short_0 = zo
example.menu.items_5.label.short_1 = zout
example.menu.items_5.label.long = Zoom Out
example.menu.items_6.id = OriginalView
example.menu.items_6.label = Original View
example.menu.items_7 = null
example.menu.elements = 0;1;2;3
example.menu.elements_0 = one
example.menu.elements_1 = two
example.menu.elements_2.number = three
example.menu.elements_2.Desc = Number
example.menu.elements_3 = null