【问题标题】:How to parse Json response in android from retrofit如何从改造中解析Android中的Json响应
【发布时间】:2021-04-24 05:43:12
【问题描述】:

大家好,谁能帮我解析以下 json 响应。

{
"result": "success",
"reason": "Operation completed successfully.",
"api": "authenticate_inmate",
"locked": false,
"payload": {
    "authenticated": true,
    "inmate_details": {
        "jail_alt_id": "9584",
        "facility_number": "1047",
        "last_name": "ARMSTRONG",
        "first_name": "DONALD",
        "dob": "19601213",
        "middle_name": "LEROY",
        "sex": "M",
        "account_frozen": "N",
        "balance": "122.73",
        "pin": "9584",
        "location": "HU H 121B",
        "macs_menu_id": "1047-2000000369",
        "indigent": 0
    },
    "order_id": "5d1f7c10-833f-0139-4675-3c97e15872c0",
    "order_detail": [{
        "id": null,
        "order_id": "5d1f7c10-833f-0139-4675-3c97e15872c0",
        "product_code": "5010",
        "quantity": 1
    }],
    "transaction_history": "\"1/25/21\",\"1.12\",\"Commissary (100301)\"\r\n\"1/25/21\",\"2.11\",\"Commissary (100301)\"\r\n\"1/25/21\",\"1.41\",\"Commissary (100301)\"\r\n\"1/25/21\",\"0.34\",\"Commissary (100301)\"\r\n\"1/25/21\",\"1.41\",\"Commissary (100301)\"\r\n\"1/22/21\",\"16.00\",\"Commissary (100301)\"\r\n\"12/22/20\",\"10.00\",\"Depositor: Testing LastName\"\r\n\"12/21/20\",\"10.00\",\"Deposit Holding Account (100199)\"\r\n\"11/20/20\",\"-1.00\",\"Commissary (100301)\"\r\n\"11/06/20\",\"5.00\",\"Deposit Holding Account (100199)\"\r\n"
}

}

我想获取 inmate_details、订单 ID、订单详情和交易历史。我需要在单个屏幕中显示这些详细信息。我从 json online 生成模型类 & 我尝试改造,但我得到的响应为 null。我在下面添加了我的代码,谢谢

apIservice=ApiClient.getClient().create(APIService.class);                    
                call=apIservice.checkLogin(inmate_id,pin);
                call.enqueue(new Callback<Payload>() {
                    @Override
                    public void onResponse(Call<Payload> call, Response<Payload> response) {
                        System.out.println(response);
                        if (response.isSuccessful()){
                          Inmate_details balance = response.body().getInmate_details();
                            pDialog.dismissWithAnimation();
                            Toasty.success(LoginActivity.this, "Success! Redirecting To Home", Toast.LENGTH_SHORT, true).show();
                            startActivity(new Intent(LoginActivity.this,PDFActivity.class));
                        }
                    }

【问题讨论】:

  • 什么是有效载荷?您是否使用 GSON 或 Jackson 等库将 JSON 转换为 Java 对象?因为该功能不是改造的本机部分,所以您需要手动完成或使用类似的库。
  • 这是我正在使用的模型类,但所有字段都显示为空,我在我的问题中添加了控制台输出。

标签: android json retrofit


【解决方案1】:
    private fun getRetrofitObject() : Retrofit {
        retrofit = Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl("Api Link")
                .build()
        return retrofit
    }

    //Calling API Add User
    private fun callAddUserAPI() {
        val apiInterface = getRetrofitObject().create(APIInterface::class.java)
        val userRequest = AddUserRequest(editTextName.text.toString(), editTextEmail.text.toString())
        val addUserAPI = apiInterface.addUserAPI(userRequest)
        addUserAPI.enqueue(object : Callback<AddUserResponse> {
            override fun onResponse(call: Call<AddUserResponse>, request: Response<AddUserResponse>) {
                val body = request.body()
               Log.i(DATA, body?.name.toString())
            }

            override fun onFailure(call: Call<AddUserResponse>, t: Throwable) {
                Log.i(DATA, FAILURE_MESSAGE)
            }
        })
    }

试试这个,也许这会很有帮助。

【讨论】:

    【解决方案2】:

    解析json 如下:

    // ResponseObject is your root object
    public class ResponseObject{
        
        @SerializedName("payload")
        private Payload payload;
    
       public Payload getPayload() {
            return payload;
        }
    }
    class Payload{
        @SerializedName("authenticated")
        private boolean isAuthenticated;
    
        @SerializedName("inmate_details")
        private InMateObject inMateObject;
    
        @SerializedName("order_id")
        private String orderId;
    
        @SerializedName("order_detail")
        private List<Order> orderList;
    
     // Make sure to get String value as response for "transaction_history" key
        @SerializedName("transaction_history")
        private String transactionDetails;
    
        public InMateObject getInMateObject() {
            return inMateObject;
        }
    }
    class InMateObject{
        @SerializedName("jail_alt_id")
        private String jainAltId;
        @SerializedName("facility_number")
        private String facilityNumber;
        @SerializedName("last_name")
        private String lastName;
        @SerializedName("first_name")
        private String firstName;
        @SerializedName("dob")
        private String dob;
        @SerializedName("middle_name")
        private String middleName;
        @SerializedName("sex")
        private String sex;
        // Add other fields like wise.
    
    }
    class Order{
        @SerializedName("id")  // If id is Integer in json then use int type
        private String id;
        @SerializedName("order_id")
        private String orderId;
        @SerializedName("product_code")
        private String productCode;
        @SerializedName("quantity")
        private int quantity;
    }
    

    然后您的Api 电话将如下所示:

             call.enqueue(new Callback<ResponseObject>() {
        @Override
        public void onResponse(Call<ResponseObject> call, Response<ResponseObject> response) {
            System.out.println(response);
            if (response.isSuccessful()){
                //Inmate_details balance = response.body().getInmate_details();
                // Basically you are getting ResponseObject as response. So, collect payload first from it. And then collect inmate_details from Payload.
                Payload payload = response.body().getPayload();
                InMateObject inMateObject = payload.getInMateObject();
                pDialog.dismissWithAnimation();
                Toasty.success(LoginActivity.this, "Success! Redirecting To Home", Toast.LENGTH_SHORT, true).show();
                startActivity(new Intent(LoginActivity.this,PDFActivity.class));
            }
        }
    }
    

    【讨论】:

    • 嘿,谢谢您的帮助。现在所有的数据都来了。非常感谢
    • 如何获取交易详情?我认为它看起来像一个 json 字符串格式。你能指导我也得到那个吗
    • 我可以看到您将 String 作为 transaction_history 的值。所以你可以检查一下,我已经更新了我的答案。
    • 嗨,我有交易详细信息的字符串值,例如带有更多特殊字符。我无法解析它。我需要在 recyclerview 中显示这些详细信息,例如日期、数量和描述。我怎样才能做到这一点?因为该字符串中没有键。
    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2015-08-18
    • 2019-02-26
    • 2020-03-19
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多