java - 使用 RxJava 和改造的格式错误的 JSON

标签 java android gson rx-java rx-android

我想从 JSON 中获取一些数据,但 gson 给出错误。我想知道如何解决这个问题?

我正在使用 dagger2(这部分 100% 正常并且工作)和 rxJava(这部分始终调用 onError 方法)。

我的模型:

@Data
@NoArgsConstructor
public class GradeModel {

//I'm using lombok to generate getters and setters.

    @SerializedName("grade")
    @Expose
    private DecimalFormat grades;

    @SerializedName("grades")
    @Expose
    private GradeModel listGrades;

    private String matter;
    private int fault;

}

我的 JSON:

grades: [

    {
        "class": "math"
        "grade": 4.5,
        "next_dates":[
            {
                "exam": "03/03/2017",
                "homework": "03/03/2017"
            }

        ]

    }

    {
        "class": "port"
        "grade": 8,
        "next_dates":[
            {
                "exam": "03/05/2017",
                "homework": "03/03/2017"
            }

        ]

    }

]

我的回应:

public class GradeResponse {

    @Inject
    Retrofit retrofit;

    @Inject
    MainPresenter mainPresenter;

    public void getGradeRx() {

        MyApplication.getMainComponent().injectIntoGradeResponse(this);// informando ao dagger sobre o uso de um component e a necessidade de injetar dependência

        Subscription getGrade = retrofit
                .create(GradeService.class)
                .getGrade()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .map(model -> {
                    // transform model
                        return model.getListGrades();
                })
                .subscribe(new Observer<GradeModel>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i(TAG, "saporra vai me matar ainda");
                    }

                    @Override
                    public void onNext(GradeModel grades) {
                        Log.i(TAG, "caralhoooooo " + grades.getGrades());
                        //mainPresenter.setListGrades(grades);
                    }
                });
    }
}

我的改造:

@Module
public class RetrofitModule {
    @Provides
    @PerActivity
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        //gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }
    @Provides
    @PerActivity
    public OkHttpClient provideHttpClient() {
        return new OkHttpClient().newBuilder().build();
    }
    @Provides
    @PerActivity
    public Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(BASE_URL)
                .client(okHttpClient)
                //converts Retrofit response into Observable
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        return retrofit;
    }
}

我的服务:

public interface GradeService {

    @GET("grades_json.json")
    Observable<GradeModel> getGrade();
}

错误:

com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

最佳答案

1) 成绩:[ 不是有效 JSON 的一部分。如果您想解析 JSON 数组,请删除 grades: 并保留 [

那么,你的Gson模型是错误的。您有 "grades""grade",而不是 "grade""next_dates"“类”

这也是两个对象。

{                    // One Object here
    "class": "math", 
    "grade": 4.5,
    "next_dates":[
        {            // Second object here
            "exam": "03/03/2017",
            "homework": "03/03/2017"
        }
    ]
}

因此,您的 Java 类将类似于

public class GradeDate {
    private String exam, homework;
}

public class GradeModel {
    private String class;
    private Double grade;
    private List<GradeDate> nextDates;
}

然后,您的 JSON 仍然缺少一些逗号来分隔外部数组中的值。

关于java - 使用 RxJava 和改造的格式错误的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43149216/

相关文章:

java - 如何使用 Selenium Webdriver 和 Java 从包含在多个 span 标签内的 span 元素中获取实际文本

java - Apache Tomcat - Ubuntu 安装程序

java - 通用 Java Web 应用程序

java - 最终标识符是必要的,为什么?

android - 升级 AndroidStuio 和 Gradle 后调试构建 APK 文件中缺少 CERT.RSA

Android - 无法打开堆栈跟踪文件

android - 以编程方式启用/禁用 Broadcastreceiver

java - 在 Android 中获取 XML 响应

java - 将 Key 值添加到 GSON.toJSON 生成的 Json 字符串中

java - 如何使用 gson 将对象序列化为一个元素的列表