Создание массива объектов JSON

Мне нужно создать объект JSON для Arraylist. Ниже приведен код

public boolean submitOrder(ArrayList<OrderDetailsData> orderList) {

        serUri = "lists.json";
        method = "post";


        JSONObject jsonObject = new JSONObject();

        JSONObject json = new JSONObject();

        JSONArray array = new JSONArray();
        try {
            for (int i = 0; i < orderList.size(); i++) {
                json.put("orderno", orderList.get(i).getOrderNumber()
                        .toString());
                json.put("tableno", orderList.get(i).getTableNumber()
                        .toString());
                json.put("itemname", orderList.get(i).getItemName().toString());
                json.put("amount", orderList.get(i).getAmount().toString());

                json.put("ordstatus", orderList.get(i).getOrderStatus()
                        .toString());
                array.put(json);



            }

         catch (JSONException je) {
            return false;
        }

        try {

            jsonObject.put("list", array);
        } catch (JSONException je) {
            return false;
        }

        WebServiceAsyncTask webServiceTask = new WebServiceAsyncTask();
        webServiceTask.execute(serUri, method,jsonObject, this);
        return true;
    }

Проблема заключается в создании объекта с деталями последнего элемента строки в каждой позиции. Скажем, если у моего OrderList есть 3 строки, созданный jsonObject имеет 3 строки, но с 3-мя строчными данными во всех 3. Кажется, что его основные данные для всех строк с последними выведенными рядами. Я пробовал пару других способов, но все же не получал желаемого результата. Пожалуйста, порекомендуйте. Спасибо.

Объект JSON создан:

{"list":[{"amount":"10.50","orderno":"0220130826163623","quantity":"1","itemname":"Pollo Al Horno","tableno":"02","ordstatus":"placed"},{"amount":"10.50","orderno":"0220130826163623","itemname":"Pollo Al Horno","tableno":"02","ordstatus":"placed"},{"amount":"10.50","orderno":"0220130826163623","itemname":"Pollo Al Horno","tableno":"02","ordstatus":"placed"},{"amount":"10.50","orderno":"0220130826163623","itemname":"Pollo Al Horno","tableno":"02","ordstatus":"placed"},{"amount":"10.50","orderno":"0220130826163623","itemname":"Pollo Al Horno","tableno":"02","ordstatus":"placed"},{"amount":"10.50","orderno":"0220130826163623","itemname":"Pollo Al Horno","tableno":"02","ordstatus":"placed"},{"amount":"10.50","orderno":"0220130826163623","itemname":"Pollo Al Horno","tableno":"02","ordstatus":"placed"},{"amount":"10.50","orderno":"0220130826163623","itemname":"Pollo Al Horno","tableno":"02","ordstatus":"placed"}]}

Вышеуказанный объект имеет только последний элемент в каждой строке.

Ответ 1

Маленькая ошибка

try {
            for (int i = 0; i < orderList.size(); i++) {

                JSONObject json = new JSONObject(); // update here

                json.put("orderno", orderList.get(i).getOrderNumber()
                        .toString());
                json.put("tableno", orderList.get(i).getTableNumber()
                        .toString());
                json.put("itemname", orderList.get(i).getItemName().toString());
                json.put("amount", orderList.get(i).getAmount().toString());

                json.put("ordstatus", orderList.get(i).getOrderStatus()
                        .toString());
                array.put(json);



            }

         catch (JSONException je) {
            return false;
        }

Ответ 2

Ваш JSONObject json = new JSONObject(); должен находиться в цикле.

Кроме того, вы не должны каждый раз получать get (i) для доступа к свойствам (для производительности). Вы можете использовать другую конструкцию цикла for:

for (OrderDetailsData data : orderList) {
  JSONObject json = new JSONObject();
  json.put("orderno", data.getOrderNumber().toString());
  // ...
}

Наконец, возможно, вам стоит подумать о функции, которая читает/записывает объект JSON из OrderDetailsData, чтобы вы могли повторно использовать код в других веб-службах.

Ответ 3

Вам нужно создать экземпляр json-объекта внутри цикла for.

Ответ 4

Посмотрите на это, я пытаюсь использовать GSON lib, попробуйте это, я не проверен. Это должно работать нормально.

От строки Json до объекта Json следующим образом:

String jsonStr = "{\"a\": \"A\"}";

Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();

Для вашего кода это должно работать нормально:

public boolean submitOrder(ArrayList<OrderDetailsData> orderList) 
{
    serUri = "lists.json";
    method = "post";

    Gson gson = new Gson();
    String jsonstr = new Gson().toJson(orderList);
    JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
    JsonObject jsonObject = element.getAsJsonObject();

    WebServiceAsyncTask webServiceTask = new WebServiceAsyncTask();
    webServiceTask.execute(serUri, method,jsonObject, this);
    return true;
}

Ответ 5

Этот следующий фрагмент создаст массив json-объектов в одном выражении, он даже выполнит нулевые проверки при создании json из объекта с использованием библиотеки Google Gson.

public boolean submitOrder(ArrayList<OrderDetailsData> orderList) {
    Gson gson = new Gson();
    JsonObject myObj = new JsonObject();

    JsonElement ordersObj = gson.toJsonTree(orderList);
    myObj.add("list", ordersObj);
}