Gson崩溃,无法调用受保护的java.text.NumberFormat(),没有args错误

时间:2014-04-03 08:12:40

标签: java gson

我想使用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

2 个答案:

答案 0 :(得分:2)

SimpleDateFormat这绝对是一个问题,因为我遇到了同样的问题并且遵循了Accollat​​ivo的adivce,并为我解决了这个问题。很奇怪。

我意识到我实际上并不需要SimpleDateFormat作为班级的变量,我只是把它放在需要的方法中,所以GSON没有必要存储SimpleDateFormat对象。为我工作!

答案 1 :(得分:1)

正如Accollat​​ivo和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