如何在请求体内发送嵌套的json对象

时间:2017-08-04 14:43:43

标签: java android android-volley

我如何在我的截击请求的正文中发送此请求, 提前谢谢

{
  "amount": "000",
  "card": {
    "number": "00000",
    "expiry_month": "00",
    "expiry_year": "00",
    "cvv": "000",
    "pin": "000"
  }
}

这是我的请求参数,我试过这个api告诉我无效的参数,请guzs帮帮我

 @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new HashMap<String, String>();
            headers.put("Authorization", User_Token);
            headers.put("Content-Type", "application/json");
            return headers;
        }

        @Override
        public String getBodyContentType() {
            return "application/json";
        }



        @Override
        public byte[] getBody() {
            Map<String, String> params = new HashMap<String, String>();
            params.put( "amount", amount);
            params.put( "card", String.valueOf(come()));

            return new JSONObject(params).toString().getBytes();
        }
        private byte[] come() {
            Map<String, String> params = new HashMap<String, String>();
            params.put( "number", number);
            params.put( "expiry_month", month);
            params.put( "expiry_year", year);
            params.put( "cvv", cvv);
            params.put( "pin", pin);
            return new JSONObject(params).toString().getBytes();
        }

2 个答案:

答案 0 :(得分:0)

使用JsonObject代替:{创建Map,将其转换为Byte[],然后获取其String.valueOf(...)。 这将允许您将整个对象作为请求的正文发送,而不是立即发送的不完整正文:{"amount":"000","card":"[B@a2e...."}

"card""[B@a2e...."发送的值的问题在于它不是您的对象及其属性的表示。相反,它只是您创建的字节数组的内存地址。

在您的代码中,对您的对象使用JsonObject,并且仅在Byte[]方法结束时转换为getBody(),因为这是您最终返回完整对象的位置:

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> headers = new HashMap<String, String>();
    headers.put("Authorization", User_Token);
    // headers.put("Content-Type", "application/json");  // This is probably redundant, as you are already setting it on getBodyContentType()
    return headers;
}

@Override
public String getBodyContentType() {
    return "application/json";
}

@Override
public byte[] getBody() {
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("amount", amount);
        jsonObject.put("card", come());
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return jsonObject.toString().getBytes();
}

private JSONObject come() throws JSONException {
    JSONObject params = new JSONObject();
    params.put( "number", number);
    params.put( "expiry_month", month);
    params.put( "expiry_year", year);
    params.put( "cvv", cvv);
    params.put( "pin", pin);
    return params;
}

答案 1 :(得分:0)

如果您需要确切的格式,则需要确保 function loadPosts() { var dataArray = new Array(); var root = 'https://jsonplaceholder.typicode.com'; $.ajax({ url: root + '/posts/', method: 'GET', async:false,// <-- success:function(msg){ dataArray = msg; } }); console.log(dataArray); } window.onload = loadPosts; number等的值作为字符串而不是整数传递。 此外,为了使代码看起来更短,破坏性更小,您可以链接month次调用。这是一个有点重构的版本:

put

我不知道@Override public byte[] getBody() { try { final JSONObject card = new JSONObject() .put("number", String.valueOf(number)) .put("expiry_month", String.valueOf(month)) .put("expiry_year", String.valueOf(year)) .put("cvv", String.valueOf(cvv)) .put("pin", String.valueOf(pin)); return new JSONObject() .put("amount", String.valueOf(amount)) .put("card", card) .toString() .getBytes(); } catch (JSONException e) { e.printStackTrace(); } //Empty json return will not help us as in this case //we will send useless empty body to the server. return null; } 的来电方面发生了什么,以及您是否能够修改该代码。但是你需要以某种方式跟踪getBody()返回,或者引入你自己的异常类,应该在null调用者端进行检查。但是如果你无法控制getBody()来电者,你需要返回一些非getBody(),空回报:

null