【问题标题】:JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ ErrorJsonReader.setLenient(true) 在第 1 行第 1 列路径接受格式错误的 JSON $ 错误
【发布时间】:2017-06-03 22:34:59
【问题描述】:

我正在尝试为我的应用程序创建忘记密码脚本。当我运行我的 apk 并尝试恢复我的密码时,我收到错误消息说 Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $错误,在我的 apk 中一切正常,我可以登录并注销或注册,但是当我重置密码时,出现 JsonReader.setLenient(true) 错误。我的 apk json 正在工作并且是正确的。请帮我。我正在分享我的代码。

{
   "operation":"resPassReq",
   "user":{
       "email":"name@example.com"

   }
}

如果请求成功,响应将类似于,

{
  "result": "success",
  "message": "Check your mail for reset password code."
}

为了完成密码重置过程,请求类似于,

{
   "operation":"resPass",
   "user":{
       "email":"name@example.com",
       "code":"bcfqa3",
       "password":"rjamalw"

   }
}

如果请求成功,响应将类似于,

{
  "result": "success",
  "message": "Password Changed Successfully"
}

ResetPasswordFragment.java

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ResetPasswordFragment extends Fragment implements View.OnClickListener{

    private AppCompatButton btn_reset;
    private EditText et_email,et_code,et_password;
    private TextView tv_timer;
    private ProgressBar progress;
    private boolean isResetInitiated = false;
    private String email;
    private CountDownTimer countDownTimer;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_password_reset,container,false);
        initViews(view);
        return view;
    }

    private void initViews(View view){

        btn_reset = (AppCompatButton)view.findViewById(R.id.btn_reset);
        tv_timer = (TextView)view.findViewById(R.id.timer);
        et_code = (EditText)view.findViewById(R.id.et_code);
        et_email = (EditText)view.findViewById(R.id.et_email);
        et_password = (EditText)view.findViewById(R.id.et_password);
        et_password.setVisibility(View.GONE);
        et_code.setVisibility(View.GONE);
        tv_timer.setVisibility(View.GONE);
        btn_reset.setOnClickListener(this);
        progress = (ProgressBar)view.findViewById(R.id.progress);


    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){

            case R.id.btn_reset:

                if(!isResetInitiated) {


                    email = et_email.getText().toString();
                    if (!email.isEmpty()) {
                        progress.setVisibility(View.VISIBLE);
                        initiateResetPasswordProcess(email);
                    } else {

                        Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show();
                    }
                } else {

                    String code = et_code.getText().toString();
                    String password = et_password.getText().toString();

                    if(!code.isEmpty() && !password.isEmpty()){

                        finishResetPasswordProcess(email,code,password);
                    } else {

                        Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show();
                    }

                }

                break;
        }
    }

    private void initiateResetPasswordProcess(String email){

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RequestInterface requestInterface = retrofit.create(RequestInterface.class);

        User user = new User();
        user.setEmail(email);
        ServerRequest request = new ServerRequest();
        request.setOperation(Constants.RESET_PASSWORD_INITIATE);
        request.setUser(user);
        Call<ServerResponse> response = requestInterface.operation(request);

        response.enqueue(new Callback<ServerResponse>() {
            @Override
            public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {

                ServerResponse resp = response.body();
                Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

                if(resp.getResult().equals(Constants.SUCCESS)){

                    Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
                    et_email.setVisibility(View.GONE);
                    et_code.setVisibility(View.VISIBLE);
                    et_password.setVisibility(View.VISIBLE);
                    tv_timer.setVisibility(View.VISIBLE);
                    btn_reset.setText("Change Password");
                    isResetInitiated = true;
                    startCountdownTimer();

                } else {

                    Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

                }
                progress.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onFailure(Call<ServerResponse> call, Throwable t) {

                progress.setVisibility(View.INVISIBLE);
                Log.d(Constants.TAG,"failed");
                Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();
                Log.d(Constants.TAG, t.getLocalizedMessage());
            }
        });
    }

    private void finishResetPasswordProcess(String email,String code, String password){

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RequestInterface requestInterface = retrofit.create(RequestInterface.class);

        User user = new User();
        user.setEmail(email);
        user.setCode(code);
        user.setPassword(password);
        ServerRequest request = new ServerRequest();
        request.setOperation(Constants.RESET_PASSWORD_FINISH);
        request.setUser(user);
        Call<ServerResponse> response = requestInterface.operation(request);

        response.enqueue(new Callback<ServerResponse>() {
            @Override
            public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {

                ServerResponse resp = response.body();
                Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

                if(resp.getResult().equals(Constants.SUCCESS)){

                    Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
                    countDownTimer.cancel();
                    isResetInitiated = false;
                    goToLogin();

                } else {

                    Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

                }
                progress.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onFailure(Call<ServerResponse> call, Throwable t) {

                progress.setVisibility(View.INVISIBLE);
                Log.d(Constants.TAG,"failed");
                Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();

            }
        });
    }

    private void startCountdownTimer(){
        countDownTimer = new CountDownTimer(120000, 1000) {

            public void onTick(long millisUntilFinished) {
                tv_timer.setText("Time remaining : " + millisUntilFinished / 1000);
            }

            public void onFinish() {
                Snackbar.make(getView(), "Time Out ! Request again to reset password.", Snackbar.LENGTH_LONG).show();
                goToLogin();
            }
        }.start();
    }

    private void goToLogin(){

        Fragment login = new LoginFragment();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.fragment_frame,login);
        ft.commit();
    }
}

RequestInterface.java

public interface RequestInterface {

    @POST("req/")
    Call<ServerResponse> operation(@Body ServerRequest request);

}

但是当我像下面这样更改我的代码时,一切正常,但问题是得到响应 onFailure

private void initiateResetPasswordProcess(String email){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RequestInterface requestInterface = retrofit.create(RequestInterface.class);

        User user = new User();
        user.setEmail(email);
        ServerRequest request = new ServerRequest();
        request.setOperation(Constants.RESET_PASSWORD_INITIATE);
        request.setUser(user);
        Call<ServerResponse> response = requestInterface.operation(request);

        response.enqueue(new Callback<ServerResponse>() {
            @Override
            public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {

                ServerResponse resp = response.body();
                Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

                if(resp.getResult().equals(Constants.SUCCESS)){

                    Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
                    et_email.setVisibility(View.GONE);
                    et_code.setVisibility(View.VISIBLE);
                    et_password.setVisibility(View.VISIBLE);
                    tv_timer.setVisibility(View.VISIBLE);
                    btn_reset.setText("Change Password");
                    isResetInitiated = true;
                    startCountdownTimer();

                } else {

                    Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

                }
                progress.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onFailure(Call<ServerResponse> call, Throwable t) {

                progress.setVisibility(View.INVISIBLE);
                Log.d(Constants.TAG,"failed");
               // Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
                et_email.setVisibility(View.GONE);
                et_code.setVisibility(View.VISIBLE);
                et_password.setVisibility(View.VISIBLE);
                tv_timer.setVisibility(View.VISIBLE);
                btn_reset.setText("Change Password");
                isResetInitiated = true;
                startCountdownTimer();
               // Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();


            }
        });
    }

    private void finishResetPasswordProcess(String email,String code, String password){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RequestInterface requestInterface = retrofit.create(RequestInterface.class);

        User user = new User();
        user.setEmail(email);
        user.setCode(code);
        user.setPassword(password);
        ServerRequest request = new ServerRequest();
        request.setOperation(Constants.RESET_PASSWORD_FINISH);
        request.setUser(user);
        Call<ServerResponse> response = requestInterface.operation(request);

        response.enqueue(new Callback<ServerResponse>() {
            @Override
            public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {

                ServerResponse resp = response.body();
                Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

                if(resp.getResult().equals(Constants.SUCCESS)){

                    Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
                    countDownTimer.cancel();
                    isResetInitiated = false;
                    goToLogin();

                } else {

                    Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

                }
                progress.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onFailure(Call<ServerResponse> call, Throwable t) {

                progress.setVisibility(View.INVISIBLE);
                Log.d(Constants.TAG,"failed");
               // Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();
                countDownTimer.cancel();
                isResetInitiated = false;
                goToLogin();

            }
        });
    }

ServerResponse.java

public class ServerResponse {

    private String result;
    private String message;
    private User user;

    public String getResult() {
        return result;
    }

    public String getMessage() {
        return message;
    }

    public User getUser() {
        return user;
    }
}

ServerRequest.java

public class ServerRequest {

    private String operation;
    private User user;

    public void setOperation(String operation) {
        this.operation = operation;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!为了给您一个很好的答案,如果您还没有看过How to Ask,它可能会对我们有所帮助。如果您可以提供minimal reproducible example,它可能也很有用。
  • 你应该分享你得到的错误。您可以通过在 onFailure 回调中将 Log.d(Constants.TAG,"failed"); 替换为 Log.d(Constants.TAG,"failed",t); 来打印它。您可能还想输出call 对象包含的任何相关信息。
  • 我收到此错误 - JsonReader.setLenient(true) 在第 1 行第 1 列路径 $ 错误接受格式错误的 JSON
  • 嗯,很明显,当您重置密码时,API 没有返回 json
  • 请告诉我如何解决它..

标签: java android json retrofit2


【解决方案1】:

解决此错误,以便在 android:JsonReader.setLenient(true) 中使用 Retrofit 2 上传图像以在第 1 行第 1 列路径 $ 错误接受格式错误的 JSON

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode ==10) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent.createChooser(intent, "Select Image"), 10);
        } else {
            Toast.makeText(this, "you have dont Permisson", Toast.LENGTH_SHORT).show();
        }
        return;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

【讨论】:

    【解决方案2】:

    我遇到过这个问题,终于解决了。

    你必须让你的 API 中的所有 $row 与数据库表中的同名,像这样

        "book_chalet_id" => $row['book_chalet_id'],
    

    所以表中必须有book_chalet_id列。

    【讨论】:

    • 这些不需要相同,只是鼓励
    【解决方案3】:
        private void initiateResetPasswordProcess(String email){
                HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
                interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
                Gson gson = new GsonBuilder()
                               .setLenient()
                               .create();
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(Constants.BASE_URL)
                        .client(client)
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .build();
    
                RequestInterface requestInterface = retrofit.create(RequestInterface.class);
    
                User user = new User();
                user.setEmail(email);
                ServerRequest request = new ServerRequest();
                request.setOperation(Constants.RESET_PASSWORD_INITIATE);
                request.setUser(user);
                Call<ServerResponse> response = requestInterface.operation(request);
    
                response.enqueue(new Callback<ServerResponse>() {
                    @Override
                    public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {
    
                        ServerResponse resp = response.body();
                        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
    
                        if(resp.getResult().equals(Constants.SUCCESS)){
    
                            Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
                            et_email.setVisibility(View.GONE);
                            et_code.setVisibility(View.VISIBLE);
                            et_password.setVisibility(View.VISIBLE);
                            tv_timer.setVisibility(View.VISIBLE);
                            btn_reset.setText("Change Password");
                            isResetInitiated = true;
                            startCountdownTimer();
    
                        } else {
    
                            Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
    
                        }
                        progress.setVisibility(View.INVISIBLE);
                    }
    
                    @Override
                    public void onFailure(Call<ServerResponse> call, Throwable t) {
    
                        progress.setVisibility(View.INVISIBLE);
                        Log.d(Constants.TAG,"failed");
                       // Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
                        et_email.setVisibility(View.GONE);
                        et_code.setVisibility(View.VISIBLE);
                        et_password.setVisibility(View.VISIBLE);
                        tv_timer.setVisibility(View.VISIBLE);
                        btn_reset.setText("Change Password");
                        isResetInitiated = true;
                        startCountdownTimer();
                       // Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();
    
    
                    }
                });
            }
    
            private void finishResetPasswordProcess(String email,String code, String password){
                HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
                interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
                Gson gson = new GsonBuilder()
                               .setLenient()
                               .create();
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(Constants.BASE_URL)
                        .client(client)
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .build();
    
                RequestInterface requestInterface = retrofit.create(RequestInterface.class);
    
                User user = new User();
                user.setEmail(email);
                user.setCode(code);
                user.setPassword(password);
                ServerRequest request = new ServerRequest();
                request.setOperation(Constants.RESET_PASSWORD_FINISH);
                request.setUser(user);
                Call<ServerResponse> response = requestInterface.operation(request);
    
                response.enqueue(new Callback<ServerResponse>() {
                    @Override
                    public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {
    
                        ServerResponse resp = response.body();
                        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
    
                        if(resp.getResult().equals(Constants.SUCCESS)){
    
                            Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
                            countDownTimer.cancel();
                            isResetInitiated = false;
                            goToLogin();
    
                        } else {
    
                            Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();
    
                        }
                        progress.setVisibility(View.INVISIBLE);
                    }
    
                    @Override
                    public void onFailure(Call<ServerResponse> call, Throwable t) {
    
                        progress.setVisibility(View.INVISIBLE);
                        Log.d(Constants.TAG,"failed");
                       // Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();
                        countDownTimer.cancel();
                        isResetInitiated = false;
                        goToLogin();
    
                    }
                });
            }
    

    【讨论】:

    • 编辑后我得到另一个错误-> java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
    • 在问题中也提供 ServerResponse 类代码。现在,这是 json 解析错误。
    • 您在哪个函数中收到此错误应为 BEGIN_OBJECT 但在第 1 行第 1 列路径 $ 为 STRING,响应是什么
    • 尝试使用 POSTMAN REST API 客户端检查 API。在那里,您将了解您输入的输入和响应。根据这一点,您将了解代码中需要更改的内容。
    • 评论不用于扩展讨论;这个对话是moved to chat
    猜你喜欢
    • 2017-02-16
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2018-05-17
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多