我有一堂课
export class TestClass { paymentDate: Date; }
当我尝试从某些服务器API获取此类的对象时,paymentDate字段以字符串形式出现,因此无法调用此字段.getDate()方法。 有没有可能避免这种转换?
我还要注意,服务器返回的模型如下:
public class TestClass
{
public DateTime? PaymentDate { get; set; }
}
答案 0 :(得分:2)
如果您需要服务器端(看起来像c#)或客户端(javascript)方面的帮助,我会感到困惑
这两种方法之一就是编写一个自定义的setter或使用一个map函数将数据从Web api映射到该类。
我还没有测试这段代码,但是它的想法是要有一个解析器来解析日期。
服务器/ c#代码:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity {
Retrofit retrofit;
ApiService apiService;
String item1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Log.i("result", getItemFromServer("5"));
getItemFromServer("5");
Log.i("msg", item1);
String item2="item2";
String item3="item3";
String[] items={item1, item2, item3};
ListAdapter adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
ListView listView=(ListView)findViewById(R.id.listView);
listView.setAdapter(adapter);
listView.setOnItemClickListener(
new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
String item=String.valueOf(parent.getItemAtPosition(i));
Toast.makeText(MainActivity.this, item, Toast.LENGTH_LONG).show();
}
}
);
}
public void getItemFromServer(String id){
retrofit=new Retrofit.Builder().baseUrl(ApiService.API_URL).build();
apiService=retrofit.create(ApiService.class);
//GET
Call<ResponseBody> comment=apiService.getByID(id);
comment.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
item1=response.body().string();
}catch (IOException e){
Log.i("Test2", "failed");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.i("Test", "get item from server failed");
}
});
}
}
我还没有测试过C#代码,但是它可以帮助您朝正确的方向前进。
在客户端(javascript /打字稿)上,您可以执行以下操作。
public class TestClass {
private DateTime paymentdate
public DateTime? PaymentDate {
get {
return paymentdate
}
set {
this.paymentdate = DateTime.ParseExact(value, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)
}
}
}
这里解析是在设置器中进行的。因此,您避免在代码中检索值。
然后您将执行以下操作:
export class TestClass {
private _paymentdate: Date;
get paymentDate(): Date {
return this._paymentDate
}
set paymentDate(value: string) {
this._paymentDate = new Date(value);
}
}
答案 1 :(得分:1)
您可以将响应包装在Date对象中
尝试
var responsePaymentDate = new Date(this.payment.paymentDate);
现在您将可以在此对象上调用get,set函数
希望这会有所帮助!