2017-03-31 108 views
0

我想从JSON获取一些数据,但是gson发出错误。我想知道我该如何解决这个问题?我使用dagger2(这部分是100%正常工作)和rxJava(这部分总是调用onError方法)。使用RxJava和改造的格式错误的JSON

我的模型:

@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 $

+0

从JSON中删除'grades:'并且它是正确的 –

+0

没有从JSON删除成绩有我可以做的事情? –

+0

为什么你不能编辑'grades_json.json'?它**不是**正确的JSON。 –

回答

1

1)​​不是有效的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仍然缺少一些逗号值外阵列中分离出来。

+0

谢谢XD这个解决它。 –