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?
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
}
Operation.Data.toJson()
, jak wspomniałem w odpowiedzi.
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/
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.
Podobne pytania
Nowe pytania
android
Android to mobilny system operacyjny Google, używany do programowania lub tworzenia urządzeń cyfrowych (smartfony, tablety, samochody, telewizory, Wear, Glass, IoT). W przypadku tematów związanych z Androidem użyj tagów specyficznych dla Androida, takich jak android-intent, android-activity, android-adapter itp. W przypadku pytań innych niż programowanie lub programowanie, ale związanych ze strukturą Androida, użyj tego linku: https: // android.stackexchange.com.