abrutsze
abrutsze

Reputation: 506

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

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.

Upvotes: 6

Views: 18134

Answers (6)

JoyfulJoyce
JoyfulJoyce

Reputation: 13

In my case it was caused by BASE_URL

when I changed this private const val BASE_URL = "https://api.airvisual.com/v2" to

private const val BASE_URL = "https://api.airvisual.com/"

and then added "/v2" to

@GET("/v2/nearest_city")

It worked just fine!

Upvotes: 0

ashenafi duressa
ashenafi duressa

Reputation: 41

may be in your metadata you have to properly write the JSON file. for example if it is array or two objects make sure not to miss the square bracket.

[
    { 
       "email" : "user.email", "verification" : "123456" 
    },
    { 
       "email" : "user.email", "verification" : "123456" 
    }
]

Upvotes: 0

Alireza Rabiei
Alireza Rabiei

Reputation: 383

Make sure that your header are correct.

In my case I send Accept-Encoding: gzip and so the server return the value with gzip. So I remove it and it works well now.

Hope helpfull...

Upvotes: 1

moh.sh
moh.sh

Reputation: 31

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

Upvotes: 3

Cătălin Florescu
Cătălin Florescu

Reputation: 5148

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

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

Upvotes: 3

Mars
Mars

Reputation: 4307

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" }

Upvotes: 1

Related Questions