Używam biblioteki Apollo Android do tworzenia zapytań do punktu końcowego GraphQL. Wszystko działa OK, dopóki nie spróbuję przekonwertować wyników z powrotem na ciągi JSON (aby przechowywać je w Pokój bazy danych). Naiwnie próbowałem użyć Moshi, ale to się nie powiodło z następującym błędem:

Nie można uzyskać dostępnych dodatkowych produktów: Brak JsonAdapter dla interfejsu com.example.MyQuery $ MyFragmentInterface

Gdzie MyFragmentInterface w interfejsie wygenerowanym przez Apollo do obsługi fragmentów zapytań.

Próbowałem więc sprawdzić, czy biblioteka Apollo ma/generuje jakieś metody konwersji, tj. coś takiego jak toJson()/fromJson(), dla wygenerowanych modeli, jednak nie mogłem znaleźć niczego użytecznego.

Czy brakuje mi czegoś oczywistego?

11
Giorgos Kylafas 19 grudzień 2019, 19:00
Najwyraźniej istnieje istotny problem w github, który zawiera możliwe obejście: github .com/apollographql/apollo-android/issues/…
 – 
Giorgos Kylafas
13 styczeń 2020, 19:02

3 odpowiedzi

Od wersji Apollo 1.3.x istnieje funkcja rozszerzenia Operation.Data.toJson() (Kotlin) i odpowiadająca jej metoda statyczna serialize w Javie. Sprawdź https://www. apollographql.com/docs/android/advanced/no-runtime/#converting-querydata-back-to-json

Z drugiej strony, ciąg Json do Query.Data, używam czegoś takiego:

fun String?.toMyData(): MyQuery.Data? {
    this ?: return null
    val query = MyQuery()
    val response: Response<MyQuery.Data> =
        OperationResponseParser(query,
                                query.responseFieldMapper(),
                                ScalarTypeAdapters.DEFAULT)
            .parse(Buffer().writeUtf8(this))
    return response.data
}
4
Giorgos Kylafas 11 czerwiec 2020, 19:17
A co z serializacją? jak konwertowanie obiektu wygenerowanej klasy na ciąg json?
 – 
user882290
21 styczeń 2021, 20:06
1
Użyj Operation.Data.toJson(), jak wspomniałem w odpowiedzi.
 – 
Giorgos Kylafas
22 styczeń 2021, 18:04

Wypróbuj Postman i sprawdź, czy błąd również tam występuje https://blog.getpostman.com/2019/06/18/postman-v7-2-supports-graphql/

0
ralf htp 17 styczeń 2020, 17:13
2
Może nie było jasne. Błąd nie pojawia się, gdy apollo-graphql analizuje odpowiedź JSON w celu utworzenia modeli, ani gdy robi to odwrotnie. Obie działają OK. Błąd pojawia się, gdy Ja biorę modele i próbuję przekonwertować je na JSON, aby zapisać je jako ciągi w bazie danych mojej aplikacji (Pokój). Użyłem do tego moshi, ale podejrzewam, że Gson lub Jackson stworzyliby podobny błąd. W każdym razie w końcu udało mi się to zrobić na podstawie tego github.com/apollographql /apollo-android/issues/…, a kiedy będę miał okazję, napiszę pełną odpowiedź.
 – 
Giorgos Kylafas
18 styczeń 2020, 14:18
Ok, nie rozumiem, więc był to problem z serializacją/deserializacją...
 – 
ralf htp
19 styczeń 2020, 12:58

Oto przykład, w jaki sposób można zdeserializować ciąg jako wygenerowany obiekt. Komentarze śródliniowe dla dalszych szczegółów.

// Sample string response
val jsonResponse = """
{
  "data": {
  {
    "id": "isbn-889-333",
    "title": "Awesome title",
    "rating": 5
  }
}
""".trimIndent()

// Create query that is expect to return above response
val query = QueryBookDetails("book_id")

// convert string to input stream
val inputStream = ByteArrayInputStream(jsonResponse.toByteArray())

// Read bytes into okio buffer
val buffer = Buffer().readFrom(inputStream)

// Use the query to parse the buffer. 
val response = query.parse(buffer)

// response.data might be the one needed by you

Pamiętaj, że odpowiedź musi uwzględniać schemat.

0
Mahendran 20 styczeń 2021, 18:25