在请求数据中命名变量时,Retrofit 2添加了Java类名称

时间:2018-10-22 10:49:13

标签: java android retrofit2

我必须使用以下模型发送数据:

{
"TransactionType": "testType",
"TransactionReference": "testSectionReference",
"TransactionDate": "2018-10-22T06:22:30.632Z",
"TransactionLines": [
{
  "ProductReference": "testProductReference",
  "ShipDate": "2018-10-22T06:22:30.632Z",
  "Quantity": 1,
  "AwardAmount": 2.0,
  "TotalAmount": 3.0
}
]
}

我通过创建一个transactionBody来做到这一点,我将其作为正文发送到请求中,如下所示:

@POST("/myCustomUrlPath")
Call<Transaction> createTransaction(
        @Body TransactionBody transactionBody
        );

TransactionBody具有以下参数:

transactionType-String

transactionReference-String

transactionDate-String

transactionLines-TransactionLines //(my custom model)

一切似乎都很好,直到我测试请求并看到TransactionLines模型的属性没有像这样发送:

"productReference":"testProductReference"

但是相反,它们是通过我的java类路径发送的:

"model.transactionLines.productReference":"testProductReference"

这当然会使我的服务器返回错误,因为它期望的是productReference而不是model.transactionLines.productReference。如何在变量名之前删除Java类模型的路径?

编辑:

我认为我的问题与建议的可能已经问到的问题没有任何关系。他们要求在json中发布数组,而在json发布中使用的自定义对象中发布变量名称时遇到问题。

但是,@ Jeel Vankhede是正确的。序列化变量的名称删除了我的java类的路径,现在请求中填充了正确的数据。谢谢!

1 个答案:

答案 0 :(得分:1)

正如Jeel在评论中建议的那样,您应该在模型类中使用@SerializedName批注。这是模型的外观:

@SerializedName("productReference")
private String productReference;

在您的TransactionLines类中。如果未指定此属性,它将仅使用默认名称进行序列化,通常可以使用该名称,但是如果出于某些原因想要其他名称,则可以在其中指定它。例如,当我真的不喜欢将Java变量命名为some_property,并且API需要像这样调用它时,我会用到它,例如:

@SerializedName("some_property")
private String someProperty;