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类

Firebase Firestore:如何在 Android 上将文档对象转换为 POJO

Java 8如何操作一个列表中的对象并将其收集到另一个列表中? [重复]