Используйте пользовательские сериализаторы JSON с firebase

Можно ли получить JsonObjects или строки в формате Json при использовании DataSnapshot.getValue()? Может быть, я не был достаточно тщательным в своем поиске, но я не смог найти способ использовать пользовательский сериализатор.


person Vinay Nagaraj    schedule 17.02.2016    source источник


Ответы (2)


Обновление: у меня не было времени просматривать документацию по последней версии SDK, но, похоже, для полей JSON есть несколько вариантов.


getValue() в DataSnapshot возвращает HashMap. Таким образом, в любом методе вашего слушателя Firebase вы можете:

  1. Получите значение DataSnapshot, которое вернет HashMap:

    HashMap<String, JSONObject> dataSnapshotValue = (HashMap<String, JSONObject>) dataSnapshot.getValue();
    
  2. Приведите Hashmap к допустимой строке JSON, используя Gson:

    String jsonString = new Gson().toJson(dataSnapshotValue);
    
  3. С этим действительным 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.

person RominaV    schedule 18.04.2016
comment
Кто-то видит это из Firebase-Team: Какое уродливое решение! Преобразование в HashMap -> в JSON-String -> сериализация в определенный тип. - person Mike Mitterer; 11.08.2016
comment
@MikeMitterer Думаю, у тебя лучший подход! Нажмите «Добавить еще один ответ» и просветите нас. - person RominaV; 11.08.2016
comment
Извините, чувак, это не предназначалось для критики ответа. Публикация была адресована команде FB и их плохой поддержке GSON! - person Mike Mitterer; 20.08.2016
comment
@MikeMitterer о, ладно, тогда извини - person RominaV; 23.08.2016
comment
Я могу поддержать комментарий Майка, сейчас 2018 год, а вы до сих пор не можете зарегистрировать собственный сериализатор... какая пустая трата ресурсов - person Emanuel Moecklin; 17.01.2018
comment
Совершенно верно, не ждите, уже 2019 год, а вы все еще не можете зарегистрировать пользовательский де/сериализатор... - person Till Krempel; 12.02.2019
comment
Верно.... подожди? На дворе 2021 год, а мы до сих пор не можем этого сделать? - person Yannick; 31.01.2021

Основываясь на ответе @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))
}

Спасибо. :)

person Francislainy Campos    schedule 04.05.2019