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 java.util.properties.Properties 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 com.google.gson), 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?

Answer

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 *