0

我是 TypeTokens 的新手,我遇到了问题。我有一个装有产品的购物车,我使用 Typetoken 将这些产品保存到 Shared Preferences 中。因为我需要从 recyclerview 中删除和删除产品。这是我添加产品的内容:

Gson gson = new Gson();
            String json = preferences.getString("artikujtShporta", "");
            ArrayList<Artikujt> artikullObject = gson
                    .fromJson(json, new TypeToken<ArrayList<Artikujt>>(){}.getType());
            if (artikullObject != null) {
                artikullObject.add(mArtikull);
                String jsonString = gson.toJson(artikullObject);
                mEditor.putString("artikujtShporta", jsonString);
                mEditor.apply();
            } else {
                ArrayList<Artikujt> arrayArtikuj = new ArrayList<>();
                arrayArtikuj.add(mArtikull);
                Type listOfTestObject = new TypeToken<ArrayList<Artikujt>>() {}.getType();
                String s = gson.toJson(arrayArtikuj, listOfTestObject);
                mEditor.putString("artikujtShporta", s);
                mEditor.apply();
            }

现在我需要将此对象与一些附加信息一起发送到服务器,如下所示:

private void sendBasketItemsToServer() {
        //service where retrofit instance is defined for current route
        ProductsService prodService = new ProductsService();

        // Retrieve the product of the shopping cart which are saved in shred preferences
        SharedPreferences preferences = getSharedPreferences(ITEMS_PREF, Context.MODE_PRIVATE);
        SharedPreferences.Editor my_editor = preferences.edit();
        String json = preferences.getString("artikujtShporta", "");
        Gson gson = new Gson();
        ArrayList<Artikujt> artikujt = gson
                .fromJson(json, new TypeToken<ArrayList<Artikujt>>(){}.getType());
        final int order_number = new Random().nextInt(26) + 75;
        String date = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(new Date());

        // initialize requestBody
        RequestBody requestBody = null;

        try {
            JSONObject jsonObject = new JSONObject();

            jsonObject.put("klienti", full_name);
            jsonObject.put("adresa", fullAddress);
            jsonObject.put("produktet", artikujt);
            jsonObject.put("date", date);
            jsonObject.put("order_number", String.valueOf(order_number));
            requestBody = RequestBody.create(String.valueOf(jsonObject),
                    MediaType.parse("application/json; charset=utf-8"));

            System.out.println(jsonObject);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        // Get token, stored in shared preferences
        SharedPreferences editor = Objects.requireNonNull(getApplicationContext())
                .getSharedPreferences(TOKEN_PREF, MODE_PRIVATE);
        String token = editor.getString("token", "");
        Callback<BasketResponse> callback = new Callback<BasketResponse>() {
            @Override
            public void onResponse(@NotNull Call<BasketResponse> call, Response<BasketResponse> response) {
                if (response.isSuccessful()) {

                    // clear products added to cart
                    my_editor.clear();
                    my_editor.apply();

                    System.out.println(response.body());
                    Intent intent = new Intent(CheckoutActivity.this, SuccessOrderActivity.class);
                    startActivity(intent);
                }
            }

            @Override
            public void onFailure(@NotNull Call<BasketResponse> call, Throwable t) {
                Toast.makeText(CheckoutActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        };
        prodService.sendBasketItemsToServer(callback, token, requestBody);
    }

所有项目都发送到服务器,我收到代码 200 作为响应,但我的产品有问题,这行:

jsonObject.put("produktet", artikujt);

显示如下: 在此处输入图像描述

是发送类的名称,而不是产品。当我在 Android Studio 中调试时,一切似乎都很好

在此处输入图像描述

我有两天时间弄清楚如何解决这个问题,但我不知道如何解决。有人可以建议我在这里缺少什么或我做错了什么。提前致谢。

编辑:我想向服务器发送如下 json :

{
    "klienti": "my name",
    "address": "my address",
    "products": [
        {
             "id": 1,
             "price": 2234,
             "category": 3,
             "created_at": 23-03-2020
        },
        {
             "id": 2,
             "price": 2534,
             "category": 3,
             "created_at": 23-03-2020
        }
    ],
    "date": 03-09-2020,
    "order_number": 93
}
4

1 回答 1

1

jsonObject.put("produktet", artikujt);

这一行只是将 java 对象添加到jsonObject. 你可以改为

jsonObject.put("produktet", new Gson().toJson(artikujt));

编辑: 如果您正在使用org.json.JSONObject,请尝试

JSONArray jsonArray = new JSONArray();
artikujt.forEach(item -> {
    jsonArray.put(new JSONObject(item));
});
jsonObject.put("produktet", jsonArray);

虽然更好的解决方案是创建一个表示目标 json 的 java 类。

class ArtikujtData {
    private String klienti;
    private String address;
    private List<Artikujt> products;
    private String date;
    @SerializedName(value = "order_number")
    private String orderNumber;

   // setters and getters
}

创建对象ArtikujtData并为其设置值并将其用作

requestBody = RequestBody.create(new Gson().toJson(artikujtData),MediaType.parse("application/json; charset=utf-8"));

于 2020-05-14T08:54:35.347 回答