JsonToKotlinClass icon indicating copy to clipboard operation
JsonToKotlinClass copied to clipboard

Class resolution not working for optional String

Open theapache64 opened this issue 5 years ago • 0 comments

Input

{
   "programmers":[
      {
         "isFirstName":"Brett",
         "lastName":"McLaughlin",
         "email":"aaaa"
      },
      {
         "firstName":"Jason",
         "lastName":"Hunter",
         "email":"bbbb"
      },
      {
         "firstName":"Elliotte",
         "lastName":"Harold",
         "email":"cccc"
      }
   ],
   "authors":[
      {
         "firstName":null,
         "lastName":"Asimov",
         "genre":"science fiction"
      },
      {
         "firstName":"Tad",
         "lastName":"Williams",
         "genre":"fantasy"
      },
      {
         "firstName":"Frank",
         "lastName":"Peretti",
         "genre":"christian fiction"
      }
   ],
   "musicians":[
      {
         "firstName":"Eric",
         "lastName":"Clapton",
         "instrument":"guitar"
      },
      {
         "firstName":"Sergei",
         "lastName":"Rachmaninoff",
         "instrument":"piano"
      }
   ]
}

Settings

JsonToKotlinBuilder()
    .setPackageName("com.my.package.name")
    .enableVarProperties(false) // optional, default : false
    .setPropertyTypeStrategy(PropertyTypeStrategy.AutoDeterMineNullableOrNot) // optional, default :  PropertyTypeStrategy.NotNullable
    .setDefaultValueStrategy(DefaultValueStrategy.AvoidNull) // optional, default : DefaultValueStrategy.AvoidNull
    .setAnnotationLib(TargetJsonConverter.MoshiCodeGen) // optional, default: TargetJsonConverter.None
    .enableComments(true) // optional, default : false
    .enableOrderByAlphabetic(true) // optional : default : false
    .enableInnerClassModel(true) // optional, default : false
    .enableMapType(true)// optional, default : false
    .enableCreateAnnotationOnlyWhenNeeded(true) // optional, default : false
    .setIndent(4)// optional, default : 4
    .setParentClassTemplate("android.os.Parcelable") // optional, default : ""
    .enableKeepAnnotationOnClass(true) // optional, default : false
    .enableAnnotationAndPropertyInSameLine(true) // optional, default : false
    .enableParcelableSupport(true) // optional, default : false
    .setPropertyPrefix("MyPrefix") // optional, default : ""
    .setPropertySuffix("MySuffix") // optional, default : ""
    .setClassSuffix("MyClassSuffix")// optional, default : ""
    .enableForceInitDefaultValueWithOriginJsonValue(true) // optional, default : false
    .enableForcePrimitiveTypeNonNullable(true) // optional, default : false
    .build(json1, "GlossResponse") // finally, get KotlinClassCode string

Expected Output

package com.my.package.name

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import android.os.Parcelable
import android.support.annotation.Keep
import kotlinx.android.parcel.Parcelize
import android.os.Parcelable

@SuppressLint("ParcelCreator")
@Parcelize
@Keep
@JsonClass(generateAdapter = true)
data class GlossResponseMyClassSuffix(
    @Json(name = "authors") val MyPrefixAuthorsMySuffix: List<AuthorMyClassSuffix> = listOf(),
    @Json(name = "musicians") val MyPrefixMusiciansMySuffix: List<MusicianMyClassSuffix> = listOf(),
    @Json(name = "programmers") val MyPrefixProgrammersMySuffix: List<ProgrammerMyClassSuffix> = listOf()
) : Parcelable {
    @SuppressLint("ParcelCreator")
    @Parcelize
    @Keep
    @JsonClass(generateAdapter = true)
    data class AuthorMyClassSuffix(
        @Json(name = "firstName") val MyPrefixFirstNameMySuffix: String? = "", // null
        @Json(name = "genre") val MyPrefixGenreMySuffix: String = "science fiction", // science fiction
        @Json(name = "lastName") val MyPrefixLastNameMySuffix: String = "Asimov" // Asimov
    ) : Parcelable

    @SuppressLint("ParcelCreator")
    @Parcelize
    @Keep
    @JsonClass(generateAdapter = true)
    data class MusicianMyClassSuffix(
        @Json(name = "firstName") val MyPrefixFirstNameMySuffix: String = "Eric", // Eric
        @Json(name = "instrument") val MyPrefixInstrumentMySuffix: String = "guitar", // guitar
        @Json(name = "lastName") val MyPrefixLastNameMySuffix: String = "Clapton" // Clapton
    ) : Parcelable

    @SuppressLint("ParcelCreator")
    @Parcelize
    @Keep
    @JsonClass(generateAdapter = true)
    data class ProgrammerMyClassSuffix(
        @Json(name = "email") val MyPrefixEmailMySuffix: String = "aaaa", // aaaa
        @Json(name = "firstName") val MyPrefixFirstNameMySuffix: String = "Jason", // Jason
        @Json(name = "isFirstName") val MyPrefixIsFirstNameMySuffix: String = "Brett", // Brett
        @Json(name = "lastName") val MyPrefixLastNameMySuffix: String = "McLaughlin" // McLaughlin
    ) : Parcelable
}

Actual Output

package com.my.package.name

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import android.os.Parcelable
import android.support.annotation.Keep
import kotlinx.android.parcel.Parcelize
import android.os.Parcelable

@SuppressLint("ParcelCreator")
@Parcelize
@Keep
@JsonClass(generateAdapter = true)
data class GlossResponseMyClassSuffix(
    @Json(name = "authors") val MyPrefixAuthorsMySuffix: List<AuthorMyClassSuffix> = listOf(),
    @Json(name = "musicians") val MyPrefixMusiciansMySuffix: List<MusicianMyClassSuffix> = listOf(),
    @Json(name = "programmers") val MyPrefixProgrammersMySuffix: List<ProgrammerMyClassSuffix> = listOf()
) : Parcelable {
    @SuppressLint("ParcelCreator")
    @Parcelize
    @Keep
    @JsonClass(generateAdapter = true)
    data class AuthorMyClassSuffix(
        @Json(name = "firstName") val MyPrefixFirstNameMySuffix: AnyMyClassSuffix? = AnyMyClassSuffix(), // null
        @Json(name = "genre") val MyPrefixGenreMySuffix: String = "science fiction", // science fiction
        @Json(name = "lastName") val MyPrefixLastNameMySuffix: String = "Asimov" // Asimov
    ) : Parcelable

    @SuppressLint("ParcelCreator")
    @Parcelize
    @Keep
    @JsonClass(generateAdapter = true)
    data class MusicianMyClassSuffix(
        @Json(name = "firstName") val MyPrefixFirstNameMySuffix: String = "Eric", // Eric
        @Json(name = "instrument") val MyPrefixInstrumentMySuffix: String = "guitar", // guitar
        @Json(name = "lastName") val MyPrefixLastNameMySuffix: String = "Clapton" // Clapton
    ) : Parcelable

    @SuppressLint("ParcelCreator")
    @Parcelize
    @Keep
    @JsonClass(generateAdapter = true)
    data class ProgrammerMyClassSuffix(
        @Json(name = "email") val MyPrefixEmailMySuffix: String = "aaaa", // aaaa
        @Json(name = "firstName") val MyPrefixFirstNameMySuffix: String = "Jason", // Jason
        @Json(name = "isFirstName") val MyPrefixIsFirstNameMySuffix: String = "Brett", // Brett
        @Json(name = "lastName") val MyPrefixLastNameMySuffix: String = "McLaughlin" // McLaughlin
    ) : Parcelable
}

NOTE: This is actually a stress I've done on the library. It was working fine previously. Found appearance in v3.6.1

theapache64 avatar Jan 27 '21 20:01 theapache64