基于Retrofit2+RxJava2:字符串转JSON并提取数据的实现方法
解决方案:从JSON字符串提取实体字段(Retrofit2 + RxJava2)
嗨,看你已经成功拿到服务器返回的JSON字符串了,接下来有两种简单的方式把它转换成你定义的col实体类集合,这样就能轻松获取creator这类字段啦,我给你详细说下:
方法一:让Retrofit自动解析JSON(推荐)
这种方式最省心,不需要手动处理字符串,Retrofit会帮你直接转成实体类列表:
1. 添加Gson转换器依赖
首先在你的build.gradle(Module级)里添加Gson转换器的依赖,版本尽量和你的Retrofit版本匹配:
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
2. 修改RetrofitClient配置
把原来的ScalarsConverterFactory替换成GsonConverterFactory,这样Retrofit就会自动解析JSON:
if(instance == null){ instance = new Retrofit.Builder() .baseUrl("http://transportor.ddns.net:3000/") .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) // 替换成这个 .build(); }
3. 修改Service接口的返回类型
因为服务器返回的是一个JSON数组,所以把返回类型从Observable<String>改成Observable<List<col>>:
@POST("collect/get") @FormUrlEncoded Observable<List<col>> getcollection(@Field("selector") String selector);
4. 接收数据并提取字段
现在在订阅的时候直接接收List<col>,遍历就能拿到每个实体的字段了:
private void getallcollection(String selector) { compositeDisposable.add(myServices.getcollection(selector) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<List<col>>(){ @Override public void accept(List<col> colList) throws Exception { // 遍历集合,逐个获取字段 for(col item : colList){ Log.d("creator", item.getCreator()); Log.d("nom_col", item.getNom_col()); Log.d("emailcol", item.getEmailcol()); // 其他字段直接调用对应的get方法即可 } } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { // 别忘了处理请求错误 Log.e("GetCollectionError", throwable.getMessage()); } })); }
方法二:手动解析JSON字符串(如果不想改动Retrofit配置)
如果暂时不想改Retrofit的转换器,也可以手动把拿到的字符串转成实体类:
用Gson手动解析
先确保已经添加了Gson依赖(和方法一的依赖一样),然后在accept方法里处理:
@Override public void accept(String s) throws Exception { // 把JSON字符串转成List<col> Gson gson = new Gson(); Type listType = new TypeToken<List<col>>(){}.getType(); List<col> colList = gson.fromJson(s, listType); // 遍历提取字段 for(col item : colList){ Log.d("creator", item.getCreator()); Log.d("date_creation_col", item.getDate_creation_col()); // 其他字段同理 } }
用原生JSON类解析(无需额外依赖)
如果不想用Gson,也可以用Android自带的org.json类来解析:
@Override public void accept(String s) throws Exception { JSONArray jsonArray = new JSONArray(s); for(int i = 0; i < jsonArray.length(); i++){ JSONObject jsonObj = jsonArray.getJSONObject(i); // 直接根据JSON键名提取字段 String creator = jsonObj.getString("creator"); String nomCol = jsonObj.getString("nom_col"); String email = jsonObj.getString("emailcol"); Log.d("creator", creator); Log.d("nom_col", nomCol); } }
小提醒
- 建议把你的实体类
col改成Col,符合Java的大驼峰命名规范,看起来更专业哦~ - 如果JSON里的键和实体类字段名不一致(比如JSON里是
user_creator,实体类是creator),可以用@SerializedName注解映射:
@SerializedName("user_creator") private String creator;
- 确保你的依赖版本相互兼容,避免出现编译或运行时错误。
内容的提问来源于stack exchange,提问作者bb azeae
相关产品推荐
相关产品推荐

