gson 格式错误的JSON异常:使用JsonReader.setLenient(true)接受第1行第1列路径中格式错误的JSON

oxcyiej7  于 2022-11-06  发布在  其他
关注(0)|答案(6)|浏览(444)

尝试使用Retrofit以JSON格式发送信息,但它进入Retrofit的onFailure方法并引发以下错误:

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

到目前为止,我已经尝试通过使用以下链接中的答案来解决这个问题:1)MalformedJsonException with Retrofit API? 2)Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
下面是我的代码:
改装接口:

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

具有连接内容的主活动:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        User user= new User("myemail@mail.ru","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) {
            }
        });

    }
}

使用者类别:

public class User {
    private String email;
    private String verificationCode;

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

}

服务器端需要如下所示的JSON:

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

我知道stackoverflow中有一些常见的问题,但它们都不能完全解决我的问题。

7qhs6swi

7qhs6swi1#

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

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

6psbrbz92#

发送数据时不会抛出异常,但是当gson试图解析服务器响应时会抛出异常。根据您的代码,您希望服务器响应一个User对象,但是您也发送了一个User对象。
您的服务器是否会响应以下内容?因为这就是您要告诉refinance with Call<User> createAccount(@Body User user)的内容
{“电子邮件”:“user.email“,“验证码”:“一二三四五六”}

3bygqnnd

3bygqnnd3#

删除Accept-Encoding头。OkHttp将为您处理gzip,但前提是您自己不设置gzip。

x4shl7ld

x4shl7ld4#

请确保标题正确。
在我的例子中,我发送了Accept-Encoding: gzip,所以服务器用gzip返回值,所以我删除了它,现在它工作得很好。
希望能帮上忙。

hs1rzwqc

hs1rzwqc5#

可能在你的元数据中,你必须正确地写JSON文件。例如,如果它是数组或两个对象,请确保不要错过方括号。

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

mm9b1k5b6#

在我的例子中,它是由BASE_URL引起的
当我将这个私有常量瓦尔BASE_URL =“https://api.airvisual.com/v2“更改为

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

然后将“/v2”添加到

@GET("/v2/nearest_city")

它工作得很好!

相关问题