如何使用改造将多维数组发送到服务器 android

how to send multidimensional array to server using retrofit android

我正在尝试使用 Retrofit 和 PHP 将 JsonObject 发送到服务器。 JsonObject 生成成功发送到 JsonObject

下方
{"neworder":"[{\"ItemName\":\"Sweet Pongal\",\"Cuisine\":\"Tiffen\",\"ItemId\":11,\"CuisineId\":1,\"itemType\":1,\"Quantity\":1,\"Restoid\":1,\"Mrp\":48,\"PackageCharges\":7,\"ItemCost\":48,\"distance\":1.3012003898620605,\"customerPhone\":\"9000539683\",\"customerName\":\"RAVI SHANKAR P\",\"Address\":\"45-2-40-11-5\/1, Ramachandra Nagar, Akkayyapalem, Visakhapatnam, Andhra Pradesh 530016, India\",\"DeliveryOptions\":\"Right now\",\"amount\":188,\"paymentMode\":\"Cash\",\"latitude\":17.7359761,\"longitude\":83.2965298},{\"ItemName\":\"Idly\",\"Cuisine\":\"Tiffen\",\"ItemId\":1,\"CuisineId\":1,\"itemType\":1,\"Quantity\":2,\"Restoid\":1,\"Mrp\":34,\"PackageCharges\":7,\"ItemCost\":68,\"distance\":1.3012003898620605,\"customerPhone\":\"9000539683\",\"customerName\":\"RAVI SHANKAR P\",\"Address\":\"45-2-40-11-5\/1, Ramachandra Nagar, Akkayyapalem, Visakhapatnam, Andhra Pradesh 530016, India\",\"DeliveryOptions\":\"Right now\",\"amount\":188,\"paymentMode\":\"Cash\",\"latitude\":17.7359761,\"longitude\":83.2965298}]"}

现在我想将此数据存储到我的服务器中,但我无法在 PHP 中捕获此 JSON,我尝试了以下 PHP 代码

$json = file_get_contents('php://input');
$obj = json_decode($json,true);

$myarray =$obj['neworder'];

if(!empty($myarray)){

$respdata['success'] = "true";
$respdata['orderid'] = $myarray;

}

请查看下面的代码,我是如何在我的 android 项目中发送 Retrofit 请求的

JSONArray OrderObj = new JSONArray();
        JSONObject OrderParms = null;

        for (CartUserModal cd : cartDetails) {
            int itemcost = (int) (cd.getQuantity() * cd.getMrp());

            double getdist = distance(cd.getRestlat(), cd.getRestlng(), setlatitude, setlongitue);

            try {
                OrderParms = new JSONObject();
                OrderParms.put("ItemName", cd.getItemname());
                OrderParms.put("Cuisine", cd.getCuisine());
                OrderParms.put("ItemId", cd.getItemid());
                OrderParms.put("CuisineId", cd.getCuisineid());
                OrderParms.put("itemType", cd.getItemtype());
                OrderParms.put("Quantity", cd.getQuantity());
                OrderParms.put("Restoid", cd.getRestoId());
                OrderParms.put("Mrp", cd.getMrp());
                OrderParms.put("PackageCharges", cd.getPackingcharges());
                OrderParms.put("ItemCost", itemcost);
                OrderParms.put("distance", getdist);
                OrderParms.put("customerPhone", custphone);
                OrderParms.put("customerName", custname);
                OrderParms.put("Address", delveryaddress);
                OrderParms.put("DeliveryOptions", deliveryoptions);
                OrderParms.put("amount", grandtotal);
                OrderParms.put("paymentMode", paymentoptions);
                OrderParms.put("latitude", setlatitude);
                OrderParms.put("longitude", setlongitue);
            }catch (JSONException e){
                e.printStackTrace();
            }
            OrderObj.put(OrderParms);
        }

        JsonObject newOrderObj = new JsonObject();
        newOrderObj.addProperty("neworder", String.valueOf(OrderObj));

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(OrderResto.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        OrderResto api = retrofit.create(OrderResto.class);

        Call<OrderResponse> call =api.SendNewPickup(newOrderObj);
        call.enqueue(new Callback<OrderResponse>() {
            @Override
            public void onResponse(Call<OrderResponse> call, Response<OrderResponse> response) {

                //Log.e("idoresopo", String.valueOf(response.body()));

                if(response.body().getResponse().equals("true")){

                    Toasty.success(getApplicationContext(), "Order Placed Successfully "+response.body().getOrderid(), Toast.LENGTH_SHORT).show();


                }else if(response.body().getResponse().equals("false")){

                    Toasty.success(getApplicationContext(), response.body().getError(), Toast.LENGTH_SHORT).show();

                    Intent maininternt = new Intent(CheckoutActivity.this, MainActivity.class);
                    startActivity(maininternt);
                    finish();
                }
            }

            @Override
            public void onFailure(Call<OrderResponse> call, Throwable t) {

            }
        });

和我的改装界面

public interface OrderResto {

    String BASE_URL = "https://api.satyamresto.com/src/routes/";

    @Headers({"Content-Type: application/json"})
    @POST("orders.php")
    Call<OrderResponse> SendNewPickup(@Body JsonObject rawJsonString);
}

我尝试了上面的代码但没有得到响应

您的 JSON 实际上是 JSON 字符串内嵌 JSON 字符串。

所以在 PHP

中试试这个
$j = '{"neworder":"[{\"ItemName\":\"Sweet Pongal\",\"Cuisine\":\"Tiffen\",\"ItemId\":11,\"CuisineId\":1,\"itemType\":1,\"Quantity\":1,\"Restoid\":1,\"Mrp\":48,\"PackageCharges\":7,\"ItemCost\":48,\"distance\":1.3012003898620605,\"customerPhone\":\"9000539683\",\"customerName\":\"RAVI SHANKAR P\",\"Address\":\"45-2-40-11-5\/1, Ramachandra Nagar, Akkayyapalem, Visakhapatnam, Andhra Pradesh 530016, India\",\"DeliveryOptions\":\"Right now\",\"amount\":188,\"paymentMode\":\"Cash\",\"latitude\":17.7359761,\"longitude\":83.2965298},{\"ItemName\":\"Idly\",\"Cuisine\":\"Tiffen\",\"ItemId\":1,\"CuisineId\":1,\"itemType\":1,\"Quantity\":2,\"Restoid\":1,\"Mrp\":34,\"PackageCharges\":7,\"ItemCost\":68,\"distance\":1.3012003898620605,\"customerPhone\":\"9000539683\",\"customerName\":\"RAVI SHANKAR P\",\"Address\":\"45-2-40-11-5\/1, Ramachandra Nagar, Akkayyapalem, Visakhapatnam, Andhra Pradesh 530016, India\",\"DeliveryOptions\":\"Right now\",\"amount\":188,\"paymentMode\":\"Cash\",\"latitude\":17.7359761,\"longitude\":83.2965298}]"}';

$obj = json_decode($j,1);
print_r($obj);

$neworder = json_decode($obj['neworder'],1);
print_r($neworder);

结果:

Array
(
    [neworder] => [{"ItemName":"Sweet Pongal","Cuisine":"Tiffen","ItemId":11,"CuisineId":1,"itemType":1,"Quantity":1,"Restoid":1,"Mrp":48,"PackageCharges":7,"ItemCost":48,"distance":1.3012003898620605,"customerPhone":"9000539683","customerName":"RAVI SHANKAR P","Address":"45-2-40-11-5/1, Ramachandra Nagar, Akkayyapalem, Visakhapatnam, Andhra Pradesh 530016, India","DeliveryOptions":"Right now","amount":188,"paymentMode":"Cash","latitude":17.7359761,"longitude":83.2965298},{"ItemName":"Idly","Cuisine":"Tiffen","ItemId":1,"CuisineId":1,"itemType":1,"Quantity":2,"Restoid":1,"Mrp":34,"PackageCharges":7,"ItemCost":68,"distance":1.3012003898620605,"customerPhone":"9000539683","customerName":"RAVI SHANKAR P","Address":"45-2-40-11-5/1, Ramachandra Nagar, Akkayyapalem, Visakhapatnam, Andhra Pradesh 530016, India","DeliveryOptions":"Right now","amount":188,"paymentMode":"Cash","latitude":17.7359761,"longitude":83.2965298}]
)
Array
(
    [0] => Array
        (
            [ItemName] => Sweet Pongal
            [Cuisine] => Tiffen
            [ItemId] => 11
            [CuisineId] => 1
            [itemType] => 1
            [Quantity] => 1
            [Restoid] => 1
            [Mrp] => 48
            [PackageCharges] => 7
            [ItemCost] => 48
            [distance] => 1.3012003898621
            [customerPhone] => 9000539683
            [customerName] => RAVI SHANKAR P
            [Address] => 45-2-40-11-5/1, Ramachandra Nagar, Akkayyapalem, Visakhapatnam, Andhra Pradesh 530016, India
            [DeliveryOptions] => Right now
            [amount] => 188
            [paymentMode] => Cash
            [latitude] => 17.7359761
            [longitude] => 83.2965298
        )

    [1] => Array
        (
            [ItemName] => Idly
            [Cuisine] => Tiffen
            [ItemId] => 1
            [CuisineId] => 1
            [itemType] => 1
            [Quantity] => 2
            [Restoid] => 1
            [Mrp] => 34
            [PackageCharges] => 7
            [ItemCost] => 68
            [distance] => 1.3012003898621
            [customerPhone] => 9000539683
            [customerName] => RAVI SHANKAR P
            [Address] => 45-2-40-11-5/1, Ramachandra Nagar, Akkayyapalem, Visakhapatnam, Andhra Pradesh 530016, India
            [DeliveryOptions] => Right now
            [amount] => 188
            [paymentMode] => Cash
            [latitude] => 17.7359761
            [longitude] => 83.2965298
        )

)