Reading and writing application settings as JSON


#1

I’m new to C++ and JUCE. I want to read and write my application settings from a file. I’m using a simple JSON structure:

{"property1":"value1", "prop2":"value2"}

I can use JSON class to parse the file and access the properties through a var object, but I see no way to set new values, except by creating a DynamicObject like this:
config = JSON::parse (“thefile.json”);
auto obj (config.getDynamicObject());
obj->setProperty(“projectName”, “This is the new project name”);

Seems like an extra step. Is there a better way of doing this? Thanks for any suggestions!


#2

You may want to check out juce::PropertiesFile, it lets you manage a properties file as a juce::PropertySet. With the JSON approach you probably will be constrained by having to use getDynamicObject()


#3

Thanks! I ended up using DynamicObject to do this because I can’t figure out where to instantiate the PropertiesFile object. I wanted it to be a member of my Config class and have the class read/write the properties and manage them for the rest of the application. It has been hard to find examples of relevant code online!


#4

Look in the Useful Tools category on the forum for my ScopedValueSaver class


#5

Yeah, JUCE and JSON are not the best of friends… There’s a bit of hoop-jumping required to create and manipulate JSON structures using var and the underlying DynamicObject and NamePropertySet. I created a helper method that might be useful:

/** Create a new var property, and either add it to an existing var object
    or create a new one. Returns the new or updated var object.
    @param name         property name
    @param value        property value
    @param varToAddTo   var to add property to, defaults to empty
*/
static var propertyAsVar(const String& name, const var &value, var varToAddTo = var())
{
    DynamicObject* obj = nullptr;
    if (varToAddTo.isVoid())
        obj = new DynamicObject();
    else
        obj = varToAddTo.getDynamicObject();

    NamedValueSet& properties = obj->getProperties();
    properties.set (name, value);
    return var (obj);
}

If you want to use JSON heavily in your project it might be good to look at e.g. JsonCpp