Moshi and Gson JSON adapters fail for messages with a map<bool, V> field
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 70/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- kotlin
- Ambito
- backend-api-design
Direzione di ricerca
Inizia leggendo JsonIntegration.mapKeyJsonFormatter() e il fixture map_types.proto esistente; l’issue segnala la gestione mancante di ProtoAdapter.BOOL e il tipo di chiave non coperto. Controlla come gli adapter JSON formattano e analizzano le altre chiavi delle map, quindi aggiungi la copertura per le chiavi bool sia per Moshi sia per Gson. Il lavoro è completato quando le chiavi bool delle map vengono serializzate come "true" o "false" e rilette correttamente.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
What happens
Any message that has a map field with a bool key cannot be used with WireJsonAdapterFactory (Moshi) or WireTypeAdapterFactory (Gson). Building the adapter throws, even when the map is empty:
java.lang.IllegalStateException: Unexpected map key type: class kotlin.Boolean
at com.squareup.wire.internal.JsonIntegration.mapKeyJsonFormatter(JsonIntegration.kt)
What should happen
bool is a valid map key type in proto2 and proto3, and the schema accepts it. The proto3 JSON mapping encodes map keys as strings, so a bool key is written as "true" or "false" and read back from those strings.
Repro
syntax = "proto3";
message MapBoolKeys {
map<bool, string> map_bool_string = 1;
}
val moshi = Moshi.Builder().add(WireJsonAdapterFactory()).build()
val value = MapBoolKeys(map_bool_string = mapOf(true to "yes", false to "no"))
moshi.adapter(MapBoolKeys::class.java).toJson(value) // throws IllegalStateException
The same happens with Gson through WireTypeAdapterFactory.
Root cause
JsonIntegration.mapKeyJsonFormatter() handles STRING and every integer key adapter but has no branch for ProtoAdapter.BOOL, so it falls through to error("Unexpected map key type: ..."). The existing map_types.proto fixture covers all key types except bool.
- Lingua principale
- Kotlin
- Stelle
- 4.4k
- Fork
- 634
- Merge medio
- 1g 21h
- PR unite (30g)
- 5
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di square/wire
-
GrpcStreamingCall() factory's executeIn() hardcodes Dispatchers.IO instead of using an incoming scopeForse già presa @oldergod l’ha presa 187 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Swift: clear a field's preserved unknown enum value from unknownFields when the field is mutatedAperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 76/100
square/wire#3672 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
I maintainer di solito rispondono entro 1 giorno
-
wasmjs on maven repo?Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
square/wire#3604 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Issue simili
-
documentation importer size:S
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
enorm-labs/event-junkie#3614 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
InsertKoinIO/koin#2477 ·
-
[Submission] AI服务引擎Apertasubmit-adaption submit-adaption-pre
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 76/100
BetterAndroid/android-notification-icon-project#783 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
coding size:s skill:kotlin-core sub-issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
SKaiNET-developers/SKaiNET#1421 ·
I maintainer di solito rispondono entro 1 giorno