kamikat / moshi-jsonapi

JSON API v1.0 Specification in Moshi.
MIT License
156 stars 35 forks source link

Type field is generated twice with JsonApiAdapter and PolymorphicAdapter #107

Open pueffl opened 4 years ago

pueffl commented 4 years ago

I'm trying to generate JsonApi for an application in Kotlin and have the following adapters:

val jsonApiAdapterFactory: JsonAdapter.Factory = ResourceAdapterFactory.builder() .add(MessageModel::class.java) .add(MultipartModel::class.java) .add(BodypartModel::class.java) .add(SingleBodyModel::class.java) .build()

val moshi = Moshi.Builder()
        .add(jsonApiAdapterFactory)
        .add(PolymorphicJsonAdapterFactory.of(Body::class.java, "type")
                .withSubtype(MultipartModel::class.java, "multipart")
                .withSubtype(SingleBodyModel::class.java, "singlebody")
                .withSubtype(MessageModel::class.java, "message"))
        .add(PolymorphicJsonAdapterFactory.of(Part::class.java, "type")
                .withSubtype(BodypartModel::class.java, "bodypart")
                .withSubtype(MessageModel::class.java, "message"))
        .add(KotlinJsonAdapterFactory())
        .build()

@JsonApi(type = "message") MessageModel {...} and @JsonApi(type = "bodypart") BodypartModel {...} are implementing interface Part:

interface Part { var content: Body? }

where content is overridden the following way: @Ignore override var content: Body? = null

When I serialize the models, the field 'type' is generated twice. I could change the @JsonApi(type = "...") annotation to something else, so I see 2 'type' fields with two different values, it is generated from the JsonApi-Adapter and the Polymorpic Adapter, but I need both.

Maybe I am wrong and this can be solved in some way, but as far as I can see, the type-parameter in @JsonApi(type = "bodypart") should not be obligatory, as it is sometimes wrong to generate it.