You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:02:35