【问题标题】:Error 400, Bad Request, Json Parse error: Unrecognized token 'agama' : was Expecting ('true','false', or 'null') in Android Retrofit with Spring Boot错误 400,错误请求,Json 解析错误:无法识别的令牌“agama”:在使用 Spring Boot 的 Android 改造中期待(“真”、“假”或“空”)
【发布时间】:2020-08-06 17:01:18
【问题描述】:

我有这种 JSON: 已编辑

{
 "tgl_Lahir": "1960-12-18 00:00:00",
 "nama": "Rahmi P",
 "keterangan": "HIDUP",
 "tempatLahir": "YOGYAKARTA",
 "noPegawai": "010713",
 "golDarah": "0",
 "statusNikah": "0",
  "hubungans": {
            "id": "10"
         },
 "agama": {
            "id_Agama": "1"
          },

 "jeniskelamin": {
            "jenisKelamin": "1"
        }
}

我有这个接口类:

    @FormUrlEncoded
    @POST("http://ipaddress/family/add")
    Call<familylistresponse> addFams(@Header("Content-Type") String content_type,
                                     @Header("Authorization") String auth,
                                     @Query("id") String id,
//                                     @Field("noPegawai") JSONObject noPegawai,
                                     @Field("agama") JSONObject agama,
                                     @Field("hubungans") JSONObject hubungans,
                                     @Field("jeniskelamin") JSONObject jeniskelamin,
                                     @Field("tgl_Lahir") JSONObject tgl_lahir,
                                     @Field("nama") JSONObject nama,
                                     @Field("keterangan") JSONObject keterangan,
                                     @Field("tempatLahir") JSONObject tempatLahir,
                                     @Field("golDarah") JSONObject goldar,
                                     @Field("statusNikah") JSONObject statusNikah);

我想将我的数据存储到数据库服务器,所以我在我的 button.setOnClickListener 中添加了这个方法:

public void addFamily(String noPegawai, String agama, String hubungan, String jenisKelamins, String tgl_Lahir, String nama, String keterangan, String tempatLahir, String golDarah, String statusNikah){
        String id=null;
        SharedPreferences preferences = getSharedPreferences("MyPref",0);
        String tokens = preferences.getString("userToken",null);
        try {
            jsonObject.put("noPegawai", noPegawai);
            jsonObject.put("agama", agama);
            jsonObject.put("hubungans", hubungan);
            jsonObject.put("jeniskelamin", jenisKelamins);
            jsonObject.put("tgl_Lahir", tgl_Lahir);
            jsonObject.put("nama", nama);
            jsonObject.put("keterangan", keterangan);
            jsonObject.put("tempatLahir", tempatLahir);
            jsonObject.put("golDarah", golDarah);
            jsonObject.put("statusNikah", statusNikah);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Call<familylistresponse> call = apiService.addFams("application/json","Bearer " + tokens , id, jsonObject, jsonObject, jsonObject, jsonObject , jsonObject, jsonObject, jsonObject, jsonObject, jsonObject);
        call.enqueue(new Callback<familylistresponse>() {
            @Override
            public void onResponse(Call<familylistresponse> call, Response<familylistresponse> response) {
                try {
                    if(response.body()!=null)
                        Toast.makeText(TambahDataKeluarga.this," response message success "+response.body(),Toast.LENGTH_LONG).show();
                    if(response.errorBody()!=null)
                        Toast.makeText(TambahDataKeluarga.this," response message error "+response.errorBody().string(),Toast.LENGTH_LONG).show();

                    Log.e("ERROR: ", response.errorBody().string());
                }catch (Exception e){
                    e.printStackTrace();
                }

                Toast.makeText(TambahDataKeluarga.this," Tokens "+tokens,Toast.LENGTH_LONG).show();

            }

            @Override
            public void onFailure(Call<familylistresponse> call, Throwable t) {
                Log.e("ERROR: ", t.getMessage());
            }
        });
    }

但是当我尝试将其发布到服务器时,它会显示此错误

有什么想法吗?还是因为我的嵌套儿子?还是我的界面类?谢谢

【问题讨论】:

  • 这里 "agama": { "id_Agama": "1" }, 是一个 JsonObject,您将它作为字符串传递。
  • @NensiKasundra 那么我该如何解决呢?因为一开始我在android中使用转换器来生成JSON,结果是String。我已经写了这个 agamas.setAgama(spAgama.getSelectedItem().toString().trim()); 来实际获取 Agama 对象。
  • @Parth 所以这意味着我需要将字符串转换为 JSON?但是我添加了一个标头来设置内容类型应用程序/JSON
  • @XVallerie 请检查我的回答

标签: java android spring-boot retrofit2 nested-object


【解决方案1】:

我已经解决了这个问题! 我不知道这是否会成为未来读者的解决方案。但至少会有所帮助。

1.接口类:我只是把表单格式改成@Body类型,我觉得实际插入数据比较容易,你只要把你输入的类型值按顺序排序,自动插入到你的服务器 API 输入格式。

 @Headers({ "Content-Type: application/json;charset=UTF-8"})
        @POST("http://ipaddress/family/add/")
        Call<familylistresponse> addFams(@Header("Authorization") String auth,
                                         @Body familylistresponse familybody);

2。嵌套对象:所以之前,我已经尝试过你们这些天给我的一些解决方案,感谢你们。但是我为解决我的问题所做的事情是不同的。如您所见,我在 agamas、hubungan 和 jeniskelamin 上嵌套了对象。我做了什么?这只是一个简单的,像这样(调用你的“GSON Generate Class”):

Agama agamas = new Agama();
agamas.setIdAgama(vAgama);
Jeniskelamin jks = new Jeniskelamin();
jks.setJenisKelamin(vJenisk);
Hubungans hubungans = new Hubungans();
hubungans.setId(vHub);

之后,您只需将这些变量添加到您的 Activity 中的主模型类中:

familylistresponse f = new familylistresponse();
  f.setTglLahir(name);
  f.setAgama(agamas);
  f.setHubungan(hubungans);
  etc....

还有 BOOM!给你~ 这是一个额外的提示:确保您在客户端应用程序上的变量与您在数据库服务器上设置的变量相同! :D 你欢迎 ~~ 如果您觉得这个答案有帮助,请投票给这个答案!

【讨论】:

    【解决方案2】:

    接口类:

      @FormUrlEncoded
        @POST("http://103.82.240.144:1111/WSHRIS/pegawai/family/add")
        Call<familylistresponse> addFams(@Header("Content-Type") String content_type,
                                         @Header("Authorization") String auth,
                                         @Query("id") String id,
                                         @Field("noPegawai") boolean noPegawai,
                                         @Field("agama") JSONObject  agama,
                                         @Field("hubungans") JSONObject hubungans,
                                         @Field("jeniskelamin") JSONObject jeniskelamin,
                                         @Field("tgl_Lahir") String tgl_lahir,
                                         @Field("nama") String nama,
                                         @Field("keterangan") String keterangan,
                                         @Field("tempatLahir") String tempatLahir,
                                         @Field("golDarah") String goldar,
                                         @Field("statusNikah") String statusNikah);
    

    在参数中传入参数 JSON 对象

        public void addFamily(String noPegawai, String agama, String hubungan, String jenisKelamins, String tgl_Lahir, String nama, String keterangan, String tempatLahir, String golDarah, String statusNikah){
                String id=null;
                SharedPreferences preferences = getSharedPreferences("MyPref",0);
                String tokens = preferences.getString("userToken",null);
    
     JSONObject agamajsonObject= new JSONObject();
     JSONObject hubungansjsonObject= new JSONObject();
     JSONObject jeniskelaminjsonObject= new JSONObject();
    
            try {
              agamajsonObject.put("id_Agama", "1");
              hubungansjsonObject.put("id", "10");
              jeniskelaminjsonObject.put("jenisKelamin", "1");
            } catch (JSONException e) {
              e.printStackTrace();
            }
    
                Call<familylistresponse> call = apiService.addFams("application/json","Bearer " + tokens , id, true, agamajsonObject, hubungansjsonObject, jeniskelaminjsonObject, tgl_Lahir, nama, keterangan, tempatLahir, golDarah,statusNikah);
                call.enqueue(new Callback<familylistresponse>() {
                    @Override
                    public void onResponse(Call<familylistresponse> call, Response<familylistresponse> response) {
                        try {
                            if(response.body()!=null)
                                Toast.makeText(TambahDataKeluarga.this," response message success "+response.body(),Toast.LENGTH_LONG).show();
                            if(response.errorBody()!=null)
                                Toast.makeText(TambahDataKeluarga.this," response message error "+response.errorBody().string(),Toast.LENGTH_LONG).show();
    
                            Log.e("ERROR: ", response.errorBody().string());
                        }catch (Exception e){
                            e.printStackTrace();
                        }
    
                        Toast.makeText(TambahDataKeluarga.this," Tokens "+tokens,Toast.LENGTH_LONG).show();
    
                    }
    
                    @Override
                    public void onFailure(Call<familylistresponse> call, Throwable t) {
                        Log.e("ERROR: ", t.getMessage());
                    }
                });
            }
    

    【讨论】:

    • 所以这个就像我需要为我想要存储的每个变量做 jsonObject.put() ?如何将其设置到我的界面?
    • 而且,当我尝试在没有 agama、hubungan 和 jenis kelamin 的情况下输入数据时,错误仍然显示相同的消息
    • "hubungans":, "agama":jeniskelamin 和上面一样
    • 我在@NensiKasundra 上面编辑了我的代码,请检查
    【解决方案3】:

    这样设置你的值。

     JSONObject jobj = new JSONObject();
        try {
          jobj.put("id_Agama", "1");
        } catch (JSONException e) {
          e.printStackTrace();
        }
    

    像这样传递你的请求。

    @Field("agama") JSONObject jobj,
    

    【讨论】:

      【解决方案4】:
      "agama":
       {
          "id_Agama": "1"
       }
      

      但是agama只是一个string所以这样解决它

      "agama":"1"

      【讨论】:

      • 实际上,从数据库中,有很多值被陈述。就像 1 代表 A 值,然后 2 代表 B 值,等等
      • 所以你必须切换到一个对象或地图......但是 String 在这里无法满足你的需要
      • 什么时候失败了?在 post 请求的反序列化期间或以后?
      • 在我的按钮保存上调用 addFamily()... 我确实在 JSONObject 的 try-catch 中编写了 Call.enqueue
      • addFamily() agama 仍然是一个字符串...不是一个对象...正常吗?
      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2018-11-12
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多