Можно ли получить JsonObjects или строки в формате Json при использовании DataSnapshot.getValue()? Может быть, я не был достаточно тщательным в своем поиске, но я не смог найти способ использовать пользовательский сериализатор.
Используйте пользовательские сериализаторы JSON с firebase
Ответы (2)
Обновление: у меня не было времени просматривать документацию по последней версии SDK, но, похоже, для полей JSON есть несколько вариантов.
getValue()
в DataSnapshot
возвращает HashMap
. Таким образом, в любом методе вашего слушателя Firebase вы можете:
Получите значение DataSnapshot, которое вернет
HashMap
:HashMap<String, JSONObject> dataSnapshotValue = (HashMap<String, JSONObject>) dataSnapshot.getValue();
Приведите
Hashmap
к допустимой строке JSON, используя Gson:String jsonString = new Gson().toJson(dataSnapshotValue);
С этим действительным
jsonString
приведите его по мере необходимости:final GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(User.class, new UserSerializer()); final Gson gson = gsonBuilder.create(); User parsedUser = gson.fromJson(jsonString, User.class);
Это дает вам возможность использовать все, что вы хотите, для приведения объекта из Firebase, вы можете использовать собственные сериализаторы, ExclusionStrategy или получить некоторые значения напрямую из HashMap
.
Основываясь на ответе @RominaV и на случай, если это может быть кому-то полезно, вот что у меня есть в Kotlin:
myRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
adapter.clear()
dataSnapshot.children.forEach {
val cardMap = it.value
val json = Gson().toJson(cardMap)
val card = Gson().fromJson<Card>(json, Card::class.java)
adapter.add(CardItem(card))
}
}
И это мой класс карт
data class Card(var courseId: String, var cardQuestion: String, var cardAnswer: String) {
constructor() : this("", "", "")
}
Я также могу получить тот же результат, пройдя через дочерние элементы dataSnapshot следующим образом:
dataSnapshot.children.forEach {
adapter.clear()
val courseId = it.child("courseId").value as String
val question = it.child("cardQuestion").value as String
val answer = it.child("cardAnswer").value as String
adapter.add(CardItem(Card(courseId, question, answer))
}
Спасибо. :)