MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path

16,687

Solution 1

GsonBuilder gsonBuilder = new GsonBuilder();  
gsonBuilder.setLenient();  
Gson gson = gsonBuilder.create(); 

// and in you adapter set this instance
GsonConverterFactory.create(gson)

Solution 2

The exception is not thrown when sending your data, but it's thrown when gson tries to parse the server response. According to your code you are expecting the server to respond with a User object but you're also sending a User object.

Does your server respond with the following? Because that's what you're telling retrofit with Call<User> createAccount(@Body User user)

{ "email" : "user.email", "verificationCode" : "123456" }

Solution 3

Remove the Accept-Encoding header. OkHttp will take care of gzip for you, but only if you aren't setting up gzip yourself.

Share:
16,687
abrutsze
Author by

abrutsze

Updated on June 17, 2022

Comments

  • abrutsze
    abrutsze almost 2 years

    Trying to send info in JSON format using Retrofit, but it enters into Retrofit's onFailure method and throws the following error:

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

    So far I have tried to solve it by using the answers from the following links: 1) MalformedJsonException with Retrofit API? 2) Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

    Here is my code:

    Retrofit interface:

    public interface ServerApi {
        @POST("/register/test")
        Call<User> createAccount(@Body User user);
    }
    

    MainActivity with connection stuff:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            User user= new User("[email protected]","vercode100");
            sendNetworkRequest(user);
        }
    
        private void sendNetworkRequest(User user){
    
            //create Retrofit instance
            Retrofit.Builder builder= new Retrofit.Builder()
                    .baseUrl("http://localhost:8080")
                    .addConverterFactory(GsonConverterFactory.create());
    
            Retrofit retrofit= builder.build();
    
            //Get client and call object for the request
            ServerApi client= retrofit.create(ServerApi.class);
            Call<User> call= client.createAccount(user);
    
            call.enqueue(new Callback<User>() {
                @Override
                public void onResponse(Call<User> call, Response<User> response) {
                }
    
                @Override
                public void onFailure(Call<User> call, Throwable t) {
                }
            });
    
        }
    }
    

    User class:

    public class User {
        private String email;
        private String verificationCode;
    
        public User(String email, String verificationCode) {
            this.email = email;
            this.verificationCode = verificationCode;
        }
    
    }
    

    The server side expects JSON like this:

    {
        "email" : "user.email",
        "verificationCode" : "123456"
    }
    

    I know that there are some common questions in stackoverflow, but neither of them fully solves my problem.

  • abrutsze
    abrutsze about 6 years
    The server side gets from me an empty query, without any JSON :(
  • Mars
    Mars about 6 years
    @abrutsze does it respond with anything? The empty query can be cause by a lot of different things. Can you change "Call<User>" into "Call<String>" and see if you still get the exception?
  • abrutsze
    abrutsze about 6 years
    Connection status is 200, but the body that I send is empty
  • abrutsze
    abrutsze about 6 years
    I have tried in this way too, the server receives a null object
  • Mars
    Mars about 6 years
    That means gson is unable to parse an empty response into a User object like you want it to by defining Call<User> in your interface
  • abrutsze
    abrutsze about 6 years
    I think it is creating the JSON file in a wrong way ( in my side, before the sending process )
  • KBriggs
    KBriggs about 4 years
    please fix the formatting on your code, your last square bracket needs an additional space preceding it
  • zhuochangjing
    zhuochangjing over 2 years
    it works for well! thx