ОПУБЛИКОВАТЬ массив JSON с индексами с помощью модернизации

#android #retrofit

#Android #модернизация

Вопрос:

Я использую retrofit для ОТПРАВКИ массива json на сервер. Данные — это что-то вроде этого:

 {something:
    {somethings:
        [
            {"param1":"value", "param2":value},
            {"param1":"value", "param2":value}
        ]
    }
}
  

однако мой сервер вынуждает меня ОБЯЗАТЕЛЬНО включать индексы в массив, например:

 {something:
    {somethings:
        {
         "0":{"param1":"value", "param2":value},
         "1":{"param1":"value", "param2":value}
        }
    }
}
  

Другими словами, невозможно отправить параметры, подобные этому:

 something[somethings][][param1]
something[somethings][][param2]
  

Я должен включить индексы:

 something[somethings][0][param1]
something[somethings][0][param2]
  

Как это сделать с помощью retrofit?

Мой интерфейс выглядит следующим образом:

 interface ApiService {
    @POST("endpoint")
    public Callback<Something> postSomething (@Body Something something);
}
  

Мои классы выглядят следующим образом:

 public class PostSomething {
    private MapOfSomething something = new MapOfSomething();

    public MapOfSomething getSomething() {
        return portfolio;
    }

    public void setSomething(MapOfSomething something) {
        this.something = something;
    }
}

public class MapOfSomething {
    private JSONObject somethings = new JSONObject();

    public JSONObject getPortfolios() {
        return somethings;
    }

    public void setSomethings(List<Something> somethingList) {

        for (int i = 0; i<somethingList.size(); i  ) {

            try {
                somethings.put(String.valueOf(i).toString(), somethingList.get(i));
            } catch (JSONException e) {
            e.printStackTrace();
            }
        }
    }
  

}

и вызывая метод, подобный:

 PostSomethings something = new PostSomethings();
MapOfSomething map = new mapOfSomething();
map.setSomethings(listofSomething);
something.setSomethings(map);
apiService.postSomething(something);
  

Комментарии:

1. ваш второй формат json неверен. Внутри массива json вы не можете поместить значение типа 0:{«param1»: «value», «param2»:value} это.

2. да, синтаксис может быть неправильным, я не очень хорошо знаком с ним. но ключевым моментом является то, что сервер ожидает индексы массива. я не могу опубликовать массив без индексов.

3. затем вы можете вручную создать json и отправить в виде строки

4. не могли бы вы поделиться кодом вашего интерфейса ?

5. @shuvro Я отредактировал свой вопрос, пожалуйста, взгляните.

Ответ №1:

Один из способов решить вашу проблему — поместить json непосредственно в body, чтобы ваш интерфейс выглядел следующим образом

 interface ApiService {
    @POST("endpoint")
    public Callback<Something> postSomething (@Body JSONObject jsonObject);
}
  

Теперь вам нужно создать JSONObject, вот как я создал желаемый JSONObject

     JSONObject mainJson = new JSONObject();

    JSONArray list = new JSONArray();

    JSONObject singleElement1 = new JSONObject();

    try {
        singleElement1.put("param1","value1");
        singleElement1.put("param2","value2");
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JSONObject singleElementSet1 = new JSONObject();

    try {
        singleElementSet1.put("1",singleElement1);
    } catch (JSONException e) {
        e.printStackTrace();
    }


    JSONObject singleElement2 = new JSONObject();

    try {
        singleElement2.put("param1","value1");
        singleElement2.put("param2","value2");
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JSONObject singleElementSet2 = new JSONObject();

    try {
        singleElementSet2.put("2",singleElement2);
    } catch (JSONException e) {
        e.printStackTrace();
    }


    list.put(singleElementSet1);
    list.put(singleElementSet2);


    JSONObject subJson = new JSONObject();

    try {
        subJson.put("something",list);
        mainJson.put("something",subJson);
    } catch (JSONException e) {
        e.printStackTrace();
    }


    Log.d("json","" mainJson.toString());
  

Я предполагаю, что прямо сейчас вы вызываете свой сервис следующим образом

   Call<Something> call = instanceOfYourAPIService.postSomething(anInstanceOfSomethingObject);
  

Но теперь вы должны заменить это следующим

   Call<Something> call = instanceOfYourAPIService.postSomething(mainJson); //mainJson is the JSONObject which is created earlier
  

Надеюсь, это поможет

Редактировать

         JSONObject mainJson = new JSONObject();

        JSONObject singleElement1 = new JSONObject();

        try {
            singleElement1.put("param1","value1");
            singleElement1.put("param2","value2");
        } catch (JSONException e) {
            e.printStackTrace();
        }


        JSONObject singleElement2 = new JSONObject();

        try {
            singleElement2.put("param1","value1");
            singleElement2.put("param2","value2");
        } catch (JSONException e) {
            e.printStackTrace();
        }


        ArrayList<JSONObject> jsonObjectArrayList = new ArrayList<JSONObject>();

        //hope you can add item to this arraylist via some loop
        jsonObjectArrayList.add(singleElement1);
        jsonObjectArrayList.add(singleElement2);



        JSONArray list = new JSONArray();


        for(int i = 0;i<jsonObjectArrayList.size();i  ){


            JSONObject elementSet = new JSONObject();
            try {
                elementSet.put(String.valueOf(i).toString(),jsonObjectArrayList.get(i));
            } catch (JSONException e) {
                e.printStackTrace();
            }

            list.put(elementSet);
        }


        JSONObject subJson = new JSONObject();

        try {
            subJson.put("something",list);
            mainJson.put("something",subJson);
        } catch (JSONException e) {
            e.printStackTrace();
        }
  

Комментарии:

1. Спасибо за ответ. Но, похоже, вы предположили, что в моем массиве JSON есть только два элемента. На самом деле это может быть тысяча элементов в массиве

2. Я точно не знаю количество элементов в массиве

3. Я предполагаю, что вы создаете такой массив путем перебора списка или arraylist . Проверьте мою правку, с помощью которой вы можете использовать любое количество элементов

4. есть небольшая проблема. теперь моя строка выглядит следующим образом:

5. @MuhammadArsal как выглядит?