我想使用gson来存储和检索Event对象。 Gson似乎正确地处理转换为json但它在gson.fromJson()方法上崩溃了。我不知道该怎么办。
public static void putValue(Context ctx, Event event){
//get preferences
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(ctx);
Gson gson = new Gson();
String json = gson.toJson(event);
Log.i(TAG, "saving "+EVENT_KEY +Integer.toString(event.getId()));
Editor editor = prefs.edit();
editor.putString(EVENT_KEY + Integer.toString(event.getId()), json);
editor.commit();
//testing
String json2 = prefs.getString(EVENT_KEY + Integer.toString(event.getId()), null);
Event savedEvent = gson.fromJson(json2, Event.class);
if(savedEvent !=null){
Log.i(TAG, "yup");
}
else{
Log.i(TAG, "nope");
}
}
活动类: https://gist.github.com/Janek2004/9950294
错误:
04-03 02:58:54.597: E/AndroidRuntime(18793): FATAL EXCEPTION: main
04-03 02:58:54.597: E/AndroidRuntime(18793): Process: com.itenwired.itenconference, PID: 18793
04-03 02:58:54.597: E/AndroidRuntime(18793): java.lang.RuntimeException: Failed to invoke protected java.text.NumberFormat() with no args
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:107)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.Gson.fromJson(Gson.java:803)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.Gson.fromJson(Gson.java:768)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.Gson.fromJson(Gson.java:717)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.Gson.fromJson(Gson.java:689)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.itenwired.itenconference.model.MyEventManager.putValue(MyEventManager.java:37)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.itenwired.itenconference.adapter.AgendaAdapter$EventHolder$1.onClick(AgendaAdapter.java:88)
04-03 02:58:54.597: E/AndroidRuntime(18793): at android.view.View.performClick(View.java:4438)
04-03 02:58:54.597: E/AndroidRuntime(18793): at android.widget.CompoundButton.performClick(CompoundButton.java:100)
04-03 02:58:54.597: E/AndroidRuntime(18793): at android.view.View$PerformClick.run(View.java:18422)
04-03 02:58:54.597: E/AndroidRuntime(18793): at android.os.Handler.handleCallback(Handler.java:733)
04-03 02:58:54.597: E/AndroidRuntime(18793): at android.os.Handler.dispatchMessage(Handler.java:95)
04-03 02:58:54.597: E/AndroidRuntime(18793): at android.os.Looper.loop(Looper.java:136)
04-03 02:58:54.597: E/AndroidRuntime(18793): at android.app.ActivityThread.main(ActivityThread.java:5017)
04-03 02:58:54.597: E/AndroidRuntime(18793): at java.lang.reflect.Method.invokeNative(Native Method)
04-03 02:58:54.597: E/AndroidRuntime(18793): at java.lang.reflect.Method.invoke(Method.java:515)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-03 02:58:54.597: E/AndroidRuntime(18793): at dalvik.system.NativeStart.main(Native Method)
04-03 02:58:54.597: E/AndroidRuntime(18793): Caused by: java.lang.InstantiationException: can't instantiate class java.text.NumberFormat
04-03 02:58:54.597: E/AndroidRuntime(18793): at java.lang.reflect.Constructor.constructNative(Native Method)
04-03 02:58:54.597: E/AndroidRuntime(18793): at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
04-03 02:58:54.597: E/AndroidRuntime(18793): at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:104)
04-03 02:58:54.597: E/AndroidRuntime(18793): ... 23 more
答案 0 :(得分:2)
SimpleDateFormat
这绝对是一个问题,因为我遇到了同样的问题并且遵循了Accollativo的adivce,并为我解决了这个问题。很奇怪。
我意识到我实际上并不需要SimpleDateFormat
作为班级的变量,我只是把它放在需要的方法中,所以GSON
没有必要存储SimpleDateFormat
对象。为我工作!
答案 1 :(得分:1)
正如Accollativo和storm143所说,这是一个问题
SELECT Max(km) - MIN(km) KiloMeter FROM positions
where deviceid = 2
Group by deviceid,devicetime
Having cast(devicetime as datetime) between MIN('2017-03-21') and Max('2017-03-26')
。如果您想将SimpleDateFormat
保留为实例变量,可以使用SimpleDateFormat
来解决此问题。
ExclusionStrategy
然后,您可以使用public class GsonDeserializeExclusion implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaredClass() == SimpleDateFormat.class;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
创建一个Gson
个实例。
GsonBuilder