Add extra attribute to POJO in Kotlin










1















I'm getting the following model from an API call through Retrofit:



data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>
)


I need to add one extra attribute for reasons related to this SO answer.



The extra argument will be a data class PaymentsMethods:



data class PaymentsMethods(
val paymentMethods: List<PaymentMethod>
)


How can I add the attribute value to User class when it is created?



Here is what I tried so far:



// add an attribute (with a default value) that won't be filled by the parser.
data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>,
@Expose var paymentsObject: PaymentMethods = PaymentMethods(payments)
)


and



// create variable and set the value on init
data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>
)
init
var paymentsObject: PaymentMethods = PaymentMethods(payments)




None of them work. Any suggestion will be much appreciated.










share|improve this question






















  • I would like to help but I have trouble reading your code. Aren't you supposed to use @SerializedName with the json key as value? @Expose only makes sense if you use GsonBuilder#excludeFieldsWithoutExposeAnnotation and I don't see you using it. Also, a class with a plural name doesn't make sense. If you use Room then you can create a TypeConverter to retrieve a list from Retrofit and directly store it.

    – ZUNJAE
    Nov 15 '18 at 13:53












  • Could you give a concrete example of what your json result looks like? (In text format, so not a POJO)

    – ZUNJAE
    Nov 15 '18 at 13:56











  • @ZUNJAE @SerializedName is only needed when the JSON attribute name differs from the POJO attribute name and for this case, I think we can ignore the @Expose annotation.

    – kike
    Nov 15 '18 at 14:05












  • @ZUNJAE and regarding the JSON, there is not need to add it. This question is about to create an extra attribute in the data class.

    – kike
    Nov 15 '18 at 14:07











  • Depending on how you compile your application (debug, release, proguard, dexguard etc.) these variable names will be changed so SerializedName is pretty important.

    – ZUNJAE
    Nov 15 '18 at 14:07















1















I'm getting the following model from an API call through Retrofit:



data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>
)


I need to add one extra attribute for reasons related to this SO answer.



The extra argument will be a data class PaymentsMethods:



data class PaymentsMethods(
val paymentMethods: List<PaymentMethod>
)


How can I add the attribute value to User class when it is created?



Here is what I tried so far:



// add an attribute (with a default value) that won't be filled by the parser.
data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>,
@Expose var paymentsObject: PaymentMethods = PaymentMethods(payments)
)


and



// create variable and set the value on init
data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>
)
init
var paymentsObject: PaymentMethods = PaymentMethods(payments)




None of them work. Any suggestion will be much appreciated.










share|improve this question






















  • I would like to help but I have trouble reading your code. Aren't you supposed to use @SerializedName with the json key as value? @Expose only makes sense if you use GsonBuilder#excludeFieldsWithoutExposeAnnotation and I don't see you using it. Also, a class with a plural name doesn't make sense. If you use Room then you can create a TypeConverter to retrieve a list from Retrofit and directly store it.

    – ZUNJAE
    Nov 15 '18 at 13:53












  • Could you give a concrete example of what your json result looks like? (In text format, so not a POJO)

    – ZUNJAE
    Nov 15 '18 at 13:56











  • @ZUNJAE @SerializedName is only needed when the JSON attribute name differs from the POJO attribute name and for this case, I think we can ignore the @Expose annotation.

    – kike
    Nov 15 '18 at 14:05












  • @ZUNJAE and regarding the JSON, there is not need to add it. This question is about to create an extra attribute in the data class.

    – kike
    Nov 15 '18 at 14:07











  • Depending on how you compile your application (debug, release, proguard, dexguard etc.) these variable names will be changed so SerializedName is pretty important.

    – ZUNJAE
    Nov 15 '18 at 14:07













1












1








1








I'm getting the following model from an API call through Retrofit:



data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>
)


I need to add one extra attribute for reasons related to this SO answer.



The extra argument will be a data class PaymentsMethods:



data class PaymentsMethods(
val paymentMethods: List<PaymentMethod>
)


How can I add the attribute value to User class when it is created?



Here is what I tried so far:



// add an attribute (with a default value) that won't be filled by the parser.
data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>,
@Expose var paymentsObject: PaymentMethods = PaymentMethods(payments)
)


and



// create variable and set the value on init
data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>
)
init
var paymentsObject: PaymentMethods = PaymentMethods(payments)




None of them work. Any suggestion will be much appreciated.










share|improve this question














I'm getting the following model from an API call through Retrofit:



data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>
)


I need to add one extra attribute for reasons related to this SO answer.



The extra argument will be a data class PaymentsMethods:



data class PaymentsMethods(
val paymentMethods: List<PaymentMethod>
)


How can I add the attribute value to User class when it is created?



Here is what I tried so far:



// add an attribute (with a default value) that won't be filled by the parser.
data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>,
@Expose var paymentsObject: PaymentMethods = PaymentMethods(payments)
)


and



// create variable and set the value on init
data class User(
@Expose val id: Int
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?,
@Expose var payments: List<PaymentMethod>
)
init
var paymentsObject: PaymentMethods = PaymentMethods(payments)




None of them work. Any suggestion will be much appreciated.







kotlin retrofit pojo data-class






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 15 '18 at 13:48









kikekike

964929




964929












  • I would like to help but I have trouble reading your code. Aren't you supposed to use @SerializedName with the json key as value? @Expose only makes sense if you use GsonBuilder#excludeFieldsWithoutExposeAnnotation and I don't see you using it. Also, a class with a plural name doesn't make sense. If you use Room then you can create a TypeConverter to retrieve a list from Retrofit and directly store it.

    – ZUNJAE
    Nov 15 '18 at 13:53












  • Could you give a concrete example of what your json result looks like? (In text format, so not a POJO)

    – ZUNJAE
    Nov 15 '18 at 13:56











  • @ZUNJAE @SerializedName is only needed when the JSON attribute name differs from the POJO attribute name and for this case, I think we can ignore the @Expose annotation.

    – kike
    Nov 15 '18 at 14:05












  • @ZUNJAE and regarding the JSON, there is not need to add it. This question is about to create an extra attribute in the data class.

    – kike
    Nov 15 '18 at 14:07











  • Depending on how you compile your application (debug, release, proguard, dexguard etc.) these variable names will be changed so SerializedName is pretty important.

    – ZUNJAE
    Nov 15 '18 at 14:07

















  • I would like to help but I have trouble reading your code. Aren't you supposed to use @SerializedName with the json key as value? @Expose only makes sense if you use GsonBuilder#excludeFieldsWithoutExposeAnnotation and I don't see you using it. Also, a class with a plural name doesn't make sense. If you use Room then you can create a TypeConverter to retrieve a list from Retrofit and directly store it.

    – ZUNJAE
    Nov 15 '18 at 13:53












  • Could you give a concrete example of what your json result looks like? (In text format, so not a POJO)

    – ZUNJAE
    Nov 15 '18 at 13:56











  • @ZUNJAE @SerializedName is only needed when the JSON attribute name differs from the POJO attribute name and for this case, I think we can ignore the @Expose annotation.

    – kike
    Nov 15 '18 at 14:05












  • @ZUNJAE and regarding the JSON, there is not need to add it. This question is about to create an extra attribute in the data class.

    – kike
    Nov 15 '18 at 14:07











  • Depending on how you compile your application (debug, release, proguard, dexguard etc.) these variable names will be changed so SerializedName is pretty important.

    – ZUNJAE
    Nov 15 '18 at 14:07
















I would like to help but I have trouble reading your code. Aren't you supposed to use @SerializedName with the json key as value? @Expose only makes sense if you use GsonBuilder#excludeFieldsWithoutExposeAnnotation and I don't see you using it. Also, a class with a plural name doesn't make sense. If you use Room then you can create a TypeConverter to retrieve a list from Retrofit and directly store it.

– ZUNJAE
Nov 15 '18 at 13:53






I would like to help but I have trouble reading your code. Aren't you supposed to use @SerializedName with the json key as value? @Expose only makes sense if you use GsonBuilder#excludeFieldsWithoutExposeAnnotation and I don't see you using it. Also, a class with a plural name doesn't make sense. If you use Room then you can create a TypeConverter to retrieve a list from Retrofit and directly store it.

– ZUNJAE
Nov 15 '18 at 13:53














Could you give a concrete example of what your json result looks like? (In text format, so not a POJO)

– ZUNJAE
Nov 15 '18 at 13:56





Could you give a concrete example of what your json result looks like? (In text format, so not a POJO)

– ZUNJAE
Nov 15 '18 at 13:56













@ZUNJAE @SerializedName is only needed when the JSON attribute name differs from the POJO attribute name and for this case, I think we can ignore the @Expose annotation.

– kike
Nov 15 '18 at 14:05






@ZUNJAE @SerializedName is only needed when the JSON attribute name differs from the POJO attribute name and for this case, I think we can ignore the @Expose annotation.

– kike
Nov 15 '18 at 14:05














@ZUNJAE and regarding the JSON, there is not need to add it. This question is about to create an extra attribute in the data class.

– kike
Nov 15 '18 at 14:07





@ZUNJAE and regarding the JSON, there is not need to add it. This question is about to create an extra attribute in the data class.

– kike
Nov 15 '18 at 14:07













Depending on how you compile your application (debug, release, proguard, dexguard etc.) these variable names will be changed so SerializedName is pretty important.

– ZUNJAE
Nov 15 '18 at 14:07





Depending on how you compile your application (debug, release, proguard, dexguard etc.) these variable names will be changed so SerializedName is pretty important.

– ZUNJAE
Nov 15 '18 at 14:07












1 Answer
1






active

oldest

votes


















0














I hope this is what you need:



data class User(
@Expose val id: Int,
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?
)
@Expose var payments: List<PaymentMethod> by Delegates.observable(listOf())
prop, oldValue, newValue ->
paymentsObject = PaymentMethods(newValue)

lateinit var paymentsObject: PaymentMethods






share|improve this answer

























  • thanks for your answer. Unfortunately, it does not work either. Apparently, Retrofit does not follow the common object initialisation (uses reflection instead), so there is no way to add an extra attribute programmatically.

    – kike
    Nov 19 '18 at 10:21











  • @kike I edited my answer. Try this one.

    – Sergey
    Nov 19 '18 at 14:08










Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53320916%2fadd-extra-attribute-to-pojo-in-kotlin%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














I hope this is what you need:



data class User(
@Expose val id: Int,
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?
)
@Expose var payments: List<PaymentMethod> by Delegates.observable(listOf())
prop, oldValue, newValue ->
paymentsObject = PaymentMethods(newValue)

lateinit var paymentsObject: PaymentMethods






share|improve this answer

























  • thanks for your answer. Unfortunately, it does not work either. Apparently, Retrofit does not follow the common object initialisation (uses reflection instead), so there is no way to add an extra attribute programmatically.

    – kike
    Nov 19 '18 at 10:21











  • @kike I edited my answer. Try this one.

    – Sergey
    Nov 19 '18 at 14:08















0














I hope this is what you need:



data class User(
@Expose val id: Int,
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?
)
@Expose var payments: List<PaymentMethod> by Delegates.observable(listOf())
prop, oldValue, newValue ->
paymentsObject = PaymentMethods(newValue)

lateinit var paymentsObject: PaymentMethods






share|improve this answer

























  • thanks for your answer. Unfortunately, it does not work either. Apparently, Retrofit does not follow the common object initialisation (uses reflection instead), so there is no way to add an extra attribute programmatically.

    – kike
    Nov 19 '18 at 10:21











  • @kike I edited my answer. Try this one.

    – Sergey
    Nov 19 '18 at 14:08













0












0








0







I hope this is what you need:



data class User(
@Expose val id: Int,
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?
)
@Expose var payments: List<PaymentMethod> by Delegates.observable(listOf())
prop, oldValue, newValue ->
paymentsObject = PaymentMethods(newValue)

lateinit var paymentsObject: PaymentMethods






share|improve this answer















I hope this is what you need:



data class User(
@Expose val id: Int,
@Expose var username: String,
@Expose var phoneNum: String?,
@Expose var email: String?
)
@Expose var payments: List<PaymentMethod> by Delegates.observable(listOf())
prop, oldValue, newValue ->
paymentsObject = PaymentMethods(newValue)

lateinit var paymentsObject: PaymentMethods







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 19 '18 at 15:16

























answered Nov 15 '18 at 18:08









SergeySergey

4,22421835




4,22421835












  • thanks for your answer. Unfortunately, it does not work either. Apparently, Retrofit does not follow the common object initialisation (uses reflection instead), so there is no way to add an extra attribute programmatically.

    – kike
    Nov 19 '18 at 10:21











  • @kike I edited my answer. Try this one.

    – Sergey
    Nov 19 '18 at 14:08

















  • thanks for your answer. Unfortunately, it does not work either. Apparently, Retrofit does not follow the common object initialisation (uses reflection instead), so there is no way to add an extra attribute programmatically.

    – kike
    Nov 19 '18 at 10:21











  • @kike I edited my answer. Try this one.

    – Sergey
    Nov 19 '18 at 14:08
















thanks for your answer. Unfortunately, it does not work either. Apparently, Retrofit does not follow the common object initialisation (uses reflection instead), so there is no way to add an extra attribute programmatically.

– kike
Nov 19 '18 at 10:21





thanks for your answer. Unfortunately, it does not work either. Apparently, Retrofit does not follow the common object initialisation (uses reflection instead), so there is no way to add an extra attribute programmatically.

– kike
Nov 19 '18 at 10:21













@kike I edited my answer. Try this one.

– Sergey
Nov 19 '18 at 14:08





@kike I edited my answer. Try this one.

– Sergey
Nov 19 '18 at 14:08



















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53320916%2fadd-extra-attribute-to-pojo-in-kotlin%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Barbados

How to read a connectionString WITH PROVIDER in .NET Core?

Node.js Script on GitHub Pages or Amazon S3