пользователей Отчет об ошибке показывает Gson().toJson(obj)
иногда возвращает {}
, но для большинства пользователей это работает правильно.
Я посетил пользователя, который столкнулся с ошибкой и отладкой приложения на его телефоне, и я сделал Toast
чтобы показать, что отправляет на сервер, и я увидел тост показывает {}
, а также Записи и ID не null
.
вот что у меня естьготово.
private class ClassA{
String ID;
ArrayList<ClassB> Records;
ClassA(String ID, ArrayList<ClassB> Records) {
this.ID= ID;
this.Records= Records;
}
}
private class ClassB {
int T;
int F;
String D;
ClassB (int T, int F, String D) {
this.T= T;
this.F = F;
this.D= D;
}
}
И здесь я делаю сериализацию объекта
ClassA obj = new ClassA(ID,Records);
String json = new Gson().toJson(obj);
, но new Gson().toJson(obj
) для некоторых пользователей работает корректно, но для некоторых возвращается {}
Сервербаза данных показывает, что некоторые пользователи отправили данные {}
, но некоторые правильные данные в формате json. После некоторых исследований, которые я обнаружил new Gson().toJson(obj
), возвращается {}
.no проблема веб-сервиса и никаких проблем с базой данных.
Дополнительная информация
ArrayList<ClassB> Records= new ArrayList<>();
Records.add(new ClassB(Integer.valueOf(t.toString()), Integer.valueOf(f.toString()),d.toString()));
ClassA obj = new ClassA(ID,Records);
String json = new Gson().toJson(obj);
База данных
id | data
----------------
c89 | {"ID":"c89","Records":[{"T":0,"F":0,"D":"2019/04/11 05:48 PM"}]} correct one
c90 | {} bug
Тест пустого ввода
Я выполнил тест ниже и обнаружил, что проблема выходит за рамкинулевые входы
ArrayList<ClassB> Records= new ArrayList<>();
ClassA obj = new ClassA(null,Records);
Toast.makeText(getApplicationContext(),new Gson().toJson(obj ),Toast.LENGTH_LONG).show();
Тост показывает {"Records":[]}
. хуже, чем верхнее условие, никогда не происходит
А также IDE говорит
if(ID!=null && Records!=null) <= this condition is always true
ClassA obj = new ClassA(ID,Records);
Proguard
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }
# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
##---------------End: proguard configuration for Gson ----------
Как мне сделать так, чтобы он работал корректно для всех пользователей?
Комментарии
Это не должно быть возможно, вам нужно больше подробностей по случаю {}, например, является ли он последовательным, из-за многопоточности, это конкретная версия JDK
Нет никаких многопоточных явлений. Например, нет Runnable
нет AsycTask
нет Thread
. Это просто обычный фрагмент, который получает данные от контент-провайдера и создает строку json.
Предлагаемое решение тот же результат!
ClassA obj = new ClassA(ID,Records);
Gson gson = new GsonBuilder().serializeNulls().create();
Toast.makeText(getActivity(), gson.toJson(obj), Toast.LENGTH_LONG).show();
Тосты {}