【问题标题】:Malformed JSON using RxJava and retrofit使用 RxJava 和改造的畸形 JSON
【发布时间】:2017-08-26 05:30:09
【问题描述】:

我想从 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:使用 JsonReader.setLenient(true) 在第 1 行列接受格式错误的 JSON 1 条路径 $

【问题讨论】:

  • grades:从JSON中去掉就对了
  • 如果不从 JSON 中删除成绩,我可以做些什么?
  • 为什么不能编辑grades_json.json?它不是正确的 JSON。
  • 您缺少一些逗号,并且 JSON 始终为任何值提供带引号的键。 jsonlint.com
  • 因为不是我的文件,所以我复制了那个 json 并在没有“成绩:”的情况下上线,仍然是相同的 onError 方法,没有任何改变。

标签: java android gson rx-java rx-android


【解决方案1】:

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

那么,你的 Gson 模型是错误的。你有"grades""grade",而不是"grade""next_dates""class"

这也是两个对象。

{                    // 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 仍然缺少一些逗号来分隔外部数组中的值。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2018-10-05
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多