Android java:如何创建 POJO 并将其转换为 Cloud Firestore REST API 可接受的 JSON
Posted
技术标签:
【中文标题】Android java:如何创建 POJO 并将其转换为 Cloud Firestore REST API 可接受的 JSON【英文标题】:Android java: How to create POJO and convert it into acceptable JSON for Cloud Firestore REST API 【发布时间】:2020-12-30 01:15:42 【问题描述】:我像这样通过postman
进行了预览测试 REST API 查询
https://firestore.googleapis.com/v1/projects/MY_PROJECT_ID/databases/(default)/documents/USER_ID_HASH/documents/112233445566
JSON 正文示例:
"fields":
"longitude":
"doubleValue": 35.5635
,
"latitude":
"doubleValue": 45.5366
并获得http响应200
,因此将使用retrofit2
在代码中实现这一点。
问题在于"doubleValue"
类似于根据值类型进行字段转换,因此它也可能是"stringValue" or "integerValue"
。问题是如何创建POJO
类以在JSON
正文中进一步转换,如上面的 JSON 正文示例?
我现在有什么:
API
公共接口 PlaceholderApi
@POST("userId/documents/timestamp")
Call<Transaction.Result> saveLocationToCloud(
@Path("userId") String userId,
@Path("timestamp") long timestamp,
@Body LocationData data
);
网络服务
public class NetworkService
private static NetworkService instance;
private static final String WEB_API_KEY = "zaSy..........VWI";
private static final String BASE_URL_CLOUD
= "https://firestore.googleapis.com/v1/projects/alocationtracker/databases/(default)/documents/";
private Retrofit retrofit;
private NetworkService()
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder client = new OkHttpClient.Builder()
.addInterceptor(interceptor);
client.interceptors().add(chain ->
Request request = chain.request();
HttpUrl url = request.url().newBuilder().addQueryParameter("key", WEB_API_KEY).build();
request = request.newBuilder().url(url).build();
return chain.proceed(request);
);
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL_CLOUD)
.addConverterFactory(GsonConverterFactory.create())
.client(client.build())
.build();
public static NetworkService getInstance()
if (instance == null)
instance = new NetworkService();
return instance;
public PlaceholderApi getJsonApi()
return retrofit.create(PlaceholderApi.class);
POJO
public class LocationData
@SerializedName("userId")
@Expose
private String userId;
@SerializedName("timestamp")
@Expose
private long timestamp;
@SerializedName("longitude")
@Expose
private double longitude;
@SerializedName("latitude")
@Expose
private double latitude;
public LocationData(String userId)
this.userId = userId;
public LocationData(String userId, Location location)
this.userId = userId;
this.timestamp = location.getTime();
this.latitude = location.getLatitude();
this.longitude = location.getLongitude();
我得到的 JSON 格式不正确,没有 "doubleValue"
等值类型。
"latitude":19.9802209,"longitude":16.1852646,"timestamp":1599830853181,"userId":"2DBtYfX1uxQszxNmod83"
我认为 POJO 类是我唯一需要以某种方式更改的东西。或者我可能需要更改 retrofit.create(PlaceholderApi.class)
的其他内容?
任何建议,请。
谢谢。
【问题讨论】:
LocationData 这个类是请求权,你能不能把你的模型贴出来回复一下。 Transaction.Result 我猜你可以在这里改变,你会得到结果。 @vikaskumar 我还没有响应模型。在这种情况下需要什么响应模型? 【参考方案1】:如果您收到来自 API 的以下响应
"fields":
"longitude":
"doubleValue": 35.5635
,
"latitude":
"doubleValue": 45.5366
然后将您的模型更改为如下所示。
public class PlacesResponseModel
@SerializedName("fields")
@Expose
private Fields fields;
public Fields getFields()
return fields;
public void setFields(Fields fields)
this.fields = fields;
public class Fields
@SerializedName("longitude")
@Expose
private Longitude longitude;
@SerializedName("latitude")
@Expose
private Latitude latitude;
public Longitude getLongitude()
return longitude;
public void setLongitude(Longitude longitude)
this.longitude = longitude;
public Latitude getLatitude()
return latitude;
public void setLatitude(Latitude latitude)
this.latitude = latitude;
public class Latitude
@SerializedName("doubleValue")
@Expose
private Double doubleValue;
public Double getDoubleValue()
return doubleValue;
public void setDoubleValue(Double doubleValue)
this.doubleValue = doubleValue;
public class Longitude
@SerializedName("doubleValue")
@Expose
private Double doubleValue;
public Double getDoubleValue()
return doubleValue;
public void setDoubleValue(Double doubleValue)
this.doubleValue = doubleValue;
并将其添加到改造 API 回调中,如下所示。
public interface PlaceholderApi
@POST("userId/documents/timestamp")
Call<PlacesResponseModel> saveLocationToCloud(
@Path("userId") String userId,
@Path("timestamp") long timestamp,
@Body LocationData data
);
最后一步现在调用这个,你应该得到你的模型映射
【讨论】:
以上是关于Android java:如何创建 POJO 并将其转换为 Cloud Firestore REST API 可接受的 JSON的主要内容,如果未能解决你的问题,请参考以下文章
android中的proguard - 我应该混淆gson POJO
保留空值——Java POJO 到 org.JSONObject
如何仅查询 Hibernate 中的有限列,并将它们映射到给定的 POJO?
jsonschema2pojo maven插件不会生成Java类