I need to save and load Json files which contains an ArrayList of Objects. Objects in the Array list : Monom Polynom and ComplexFunction.
Explanation: In this project, I have 3 main objects and 1 object that holds all of them in one list. (all of those implements "function" interface)
- Monom - build from two fields double coefficient, int power.
- Polynom - an ArrayList of Monoms
- ComplexFunction - holds two function objects, left and right, and operation between them (time div...)
I need to build one more object, Functions_GUI, that can contain all of those "function" in a collection... I used ArrayList called list. this object needs to have 2 main functions:
- saveToFile - save this Functions_GUI to a JSON with a given file name using Gson.
My Code:
public void saveToFile(String file) throws IOException {
try
{
Gson gson = new Gson();
String json = gson.toJson(this);
System.out.println(json);
String file_name = file+".json";
PrintWriter pw = new PrintWriter(new File(file_name));
pw.write(json);
pw.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
After doing so I get this file:
[
{"PloynomList":[]},
{"CF_LeftFunction":
{"PloynomList":[
{"Coefficient":1.0,"Power":3},
{"Coefficient":-13.0,"Power":2},
{"Coefficient":-2.0,"Power":0}]},
"CF_RightFunction":{
"PloynomList":[
{"Coefficient":1.0,"Power":1},
{"Coefficient":-2.0,"Power":0}]},
"CF_Operation":"Divid"},
{"PloynomList":[
{"Coefficient":1.0,"Power":3},
{"Coefficient":-13.0,"Power":2},
{"Coefficient":-2.0,"Power":0}]},
{"PloynomList":[
{"Coefficient":1.0,"Power":4},
{"Coefficient":-2.0,"Power":0}]},
{"PloynomList":[
{"Coefficient":1.0,"Power":1},
{"Coefficient":-2.0,"Power":0}]},
{"PloynomList":[
{"Coefficient":12.0,"Power":1},
{"Coefficient":-2.0,"Power":0}]},
{"PloynomList":[
{"Coefficient":-2.0,"Power":7},
{"Coefficient":1.0,"Power":1}]}
]
- initFromFile - take a JSON file and initialize a Functions_GUI object from it.
My Code:
public void initFromFile(String file) throws IOException {
try {
Gson gson = new Gson();
JsonReader reader = new JsonReader (new FileReader(file));
Functions_GUI tg1 = gson.fromJson(reader, Functions_GUI.class);
this.list=tg1.list;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
The file as you can see above has been created with all the fields from all the objects.. but when I try to read the same file and create a new Function_GUI from it I get the following error:
Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to invoke no-args constructor for interface Ex1.function. Register an InstanceCreator with Gson for this type may fix this problem.
at Ex1.Functions_GUI.initFromFile(Functions_GUI.java:125)
at Ex1.MainTest.main(MainTest.java:183)
Caused by: java.lang.RuntimeException: Unable to invoke no-args constructor for interface Ex1.function. Register an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:167)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
at com.google.gson.Gson.fromJson(Gson.java:795)
at Ex1.Functions_GUI.initFromFile(Functions_GUI.java:122)
... 1 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gson.internal.UnsafeAllocator$1.newInstance(UnsafeAllocator.java:48)
at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:164)
... 7 more
Caused by: java.lang.InstantiationException: Ex1.function
at sun.misc.Unsafe.allocateInstance(Native Method)
... 13 more
Please advise!!