【问题标题】:TypeToken Object is not displayed correctly in the serverTypeToken 对象在服务器中显示不正确
【发布时间】:2020-05-14 07:48:29
【问题描述】:

我是 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
}

【问题讨论】:

  • 你能用文本格式的预期和实际 json 更新问题吗?

标签: java android gson typetoken


【解决方案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"));

【讨论】:

  • jsonObject.put("produktet", new Gson().toJson(artikujt)),不工作
  • 将所有产品作为一个字符串发送/
  • JSONObject 类的完整包名是什么?您能否尝试使用另一种解决方案,即创建一个单独的类并为其设置数据。
  • 如果我想尝试其他解决方案,我必须更改很多东西。
  • JSONObject 类的完整包名是什么?
猜你喜欢
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多