Backward compatibility with JSON

I have a java application which saves the fields of an object to a file and load them later again.

I used so far a modified version of file (the properties were written in the order they were put in the properties object). I defined for each field a property-key and use the following function to set the property in the properties object

properties.setProperty(PROPERTY_KEY_FIELD_X, field_x);

and used the following function if I want to read back from the properties file

field_x = properties.getProperty(PROPERTY_KEY_FIELD_X, ""));

where I can add a default value which will be choosed, when there is no property with the specified key. As I maybe add some fields in the future in the class from which the fields were saved in the file, I used this option with the default value to set a field to some defined value for the case I load a properties file which was written with an older version of this class.

So far it works but with some obvious disadvantage, for example I can’t use the same property key more than once, I have to add some kind of indices like 1_PROPERTY_KEY, 2_PROPERTY_KEY. Thats why I came across JSON.

I’m not very familiar with JSON and all the things we can achieve with it. But I know I could use it to save the fields of an object to the JSON notation and read it back for example with Gson

//Object to JSON
Gson gson = new Gson();
String json = gson.toJson(object);

//JSON to Object
object = gson.fromJson(json);

But I assume this will fail, if the class is a newer version (i.e. some new fields) when try to read back from the JSON. How can I treat this? Do I have to take care of every seperate field similar to the the current implementation with properties? For example like this (with, assuming jsonString is the string read from the file:

//try/catch block omitted
JSONParser parser = new JSONParser();
JSONElement json = parser.parse(jsonString);
field_x = json.getAsString("field_x");

and take care if something failed to set default values to the fields?

Or is there a completely different approach without JSON or is JSON in general suitable for my use-case?


I’m not an expert of JSON too. But I used it sometimes with Jackson and I think Gson is very similar. If you want to use versioned objects just assure in your object constructor that fields are given with a default value (outside correct values range). Jackson will match only those json fields where it finds a correspondent filed in th Java object. Otherwise the default value is kept.

Leave a Reply

Your email address will not be published. Required fields are marked *