【问题标题】:MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 pathMalformedJsonException:使用 JsonReader.setLenient(true) 在第 1 行第 1 列路径接受格式错误的 JSON
【发布时间】:2018-08-25 05:15:46
【问题描述】:

尝试使用 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);
}

MainActivity 与连接的东西:

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中有一些常见的问题,但都没有完全解决我的问题。

【问题讨论】:

标签: android json gson retrofit retrofit2


【解决方案1】:
GsonBuilder gsonBuilder = new GsonBuilder();  
gsonBuilder.setLenient();  
Gson gson = gsonBuilder.create(); 

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

【讨论】:

  • 我也试过这种方式,服务端收到一个空对象
【解决方案2】:

发送数据时不会抛出异常,但是当 gson 尝试解析服务器响应时会抛出异常。根据您的代码,您希望服务器使用 User 对象进行响应,但您也发送了一个 User 对象。

您的服务器是否响应以下内容?因为这就是你所说的用Call&lt;User&gt; createAccount(@Body User user)进行改造

{ “电子邮件”:“用户.email”, “验证码”:“123456”}

【讨论】:

  • 服务器端从我这里得到一个空查询,没有任何 JSON :(
  • @abrutsze 它有什么回应吗?空查询可能是由许多不同的事情引起的。能不能把“Call”改成“Call”看看是否还有异常?
  • 连接状态是200,但是我发送的正文是空的
  • 这意味着 gson 无法通过在您的界面中定义 Call 将空响应解析为用户对象,就像您希望的那样
  • 我认为它以错误的方式创建 JSON 文件(在我这边,在发送过程之前)
【解决方案3】:

删除 Accept-Encoding 标头。 OkHttp 会为您处理 gzip,但前提是您没有自己设置 gzip。

【讨论】:

  • 效果很好!谢谢
【解决方案4】:

确保您的标题正确。

在我的情况下,我发送Accept-Encoding: gzip,因此服务器使用 gzip 返回值。所以我删除了它,它现在运行良好。

希望对您有所帮助...

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • 请修正你的代码格式,你的最后一个方括号前面需要一个额外的空格
    【解决方案6】:

    在我的情况下,它是由 BASE_URL 引起的

    当我改变这个 private const val BASE_URL = "https://api.airvisual.com/v2" 到

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

    然后将“/v2”添加到

    @GET("/v2/nearest_city")
    

    效果很好!

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 2018-05-17
      • 2020-02-08
      • 1970-01-01
      相关资源
      最近更新 更多