Модифицировать возвращаемые параметры объекта не по порядку, со знаком @ и кавычками

Я использую модификацию, чтобы отправить вызов api, чтобы опубликовать проблему в системе отслеживания ошибок через мое приложение для Android. API нужно отформатировать определенным образом, поэтому я создал настраиваемый объект для передачи в качестве параметра. К сожалению, когда я отправляю запрос в API, он неправильно его форматирует. Он упорядочивает параметры в алфавитном порядке, помещает в кавычки как ключи, так и значения и добавляет @ в начало моих данных, что приводит к тому, что API не может понять, что я пытаюсь опубликовать. Я хочу отправить следующий формат:

{ fb_user_id: dummyUID, 
email: [email protected], 
first_name: John, 
last_name: Smith, 
project: android, 
type: bug, 
subject: title, 
description: description }

Вместо вышеуказанного мой api получает данные как

@"description":"description",
"email":"[email protected]",
"fb_user_id":"dummyUID",
"first_name":"John",
"last_name":"Smith",
"project":"android",
"subject":"title",
"type":"bug"

Для этого я использую дооснащение, и мой интерфейс выглядит как

public interface MyAPI {
@POST("/op_create_ticket")
Observable<JsonElement> createTicket(@Body Ticket ticket);
}

И моя деятельность называет это похожим на:

public class HelpActivity extends BaseActivity {

    @BindView(R.id.textView)
    TextView textView;
    @BindView(R.id.spinner)
    Spinner spinner;
    @BindView(R.id.email)
    EditText email;
    @BindView(R.id.firstName)
    EditText firstName;
    @BindView(R.id.lastName)
    EditText lastName;
    @BindView(R.id.subject)
    EditText title;
    @BindView(R.id.description)
    EditText description;
    @BindView(R.id.button3)
    Button button3;

    FirebaseAuth fbauth = FirebaseAuth.getInstance();
    FirebaseUser user = fbauth.getCurrentUser();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_help);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.button3)
    public void onViewClicked() {
        final GsonBuilder gsonBuilder = new GsonBuilder();
        final Gson gson = gsonBuilder.create();
        Retrofit.Builder builder = new Retrofit.Builder();
        builder.baseUrl("https://my.url");
        builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
        builder.addConverterFactory(GsonConverterFactory.create());

        Retrofit retrofit = builder.build();
        MyAPI api = retrofit.create(TriggerWatchAPI.class);

        Ticket ticket = new Ticket();
        ticket.setFb_user_id(user.getUid());
        ticket.setEmail(email.getText().toString());
        ticket.setFirst_name(firstName.getText().toString());
        ticket.setLast_name(lastName.getText().toString());
        ticket.setProject("android");
        ticket.setType("design");
        ticket.setSubject(title.getText().toString());
        ticket.setDescription(description.getText().toString());

        api.createTicket(ticket).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<JsonElement>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(JsonElement jsonElement) {
                        Log.d(getTag(), "zzzOnNext");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(getTag(), "err", e);
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

Мне интересно, есть ли какой-нибудь конвертер или что-то, что может преобразовать мой объект в те данные, которые ищет API.

изменить: забыл добавить свой собственный pojo

package watch.trigger.Model;

public class Ticket {

        private String project;

        private String first_name;

        private String email;

        private String description;

        private String subject;

        private String last_name;

        private String fb_user_id;

        private String type;

        public String getProject ()
        {
            return project;
        }

        public void setProject (String project)
        {
            this.project = project;
        }

        public String getFirst_name ()
        {
            return first_name;
        }

        public void setFirst_name (String first_name)
        {
            this.first_name = first_name;
        }

        public String getEmail ()
        {
            return email;
        }

        public void setEmail (String email)
        {
            this.email = email;
        }

        public String getDescription ()
        {
            return description;
        }

        public void setDescription (String description)
        {
            this.description = description;
        }

        public String getSubject ()
        {
            return subject;
        }

        public void setSubject (String subject)
        {
            this.subject = subject;
        }

        public String getLast_name ()
        {
            return last_name;
        }

        public void setLast_name (String last_name)
        {
            this.last_name = last_name;
        }

        public String getFb_user_id ()
        {
            return fb_user_id;
        }

        public void setFb_user_id (String fb_user_id)
        {
            this.fb_user_id = fb_user_id;
        }

        public String getType ()
        {
            return type;
        }

        public void setType (String type)
        {
            this.type = type;
        }

        @Override
        public String toString()
        {
            return "ClassPojo [project = "+project+", first_name = "+first_name+", email = "+email+", description = "+description+", subject = "+subject+", last_name = "+last_name+", fb_user_id = "+fb_user_id+", type = "+type+"]";
        }
    }

Пожалуйста, добавьте код Ticket.class

ILLIA DEREVIANKO 26.10.2018 23:40

только что понял, что не хватает

Paxana Non Grata 26.10.2018 23:41

Можете ли вы добавить журналы модернизации?

ILLIA DEREVIANKO 27.10.2018 00:00

Не знаком с модернизацией, но API ожидает JSON? Есть ли заголовок или аннотация, которые нужно установить, чтобы сообщить об отправке JSON?

David Conrad 27.10.2018 00:20

это на самом деле json, если он не использует кавычки? я думал, что у json будут кавычки

Paxana Non Grata 27.10.2018 00:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
83
1

Ответы 1

не отправляйте настраиваемый объект, отправляйте объект JSON в виде строки, а в API получайте его как объект JSON.

сначала добавьте это в свой градиент:

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'

1- изменить это

public interface MyAPI {

@Headers("Content-Type: application/json")
@POST("/op_create_ticket")
Observable<JsonElement> createTicket(@Body Ticket ticket);
}

к :

public interface MyAPI {
@POST("/op_create_ticket")
Observable<String> createTicket(@Body String ticket);
}

2- изменить это

Ticket ticket = new Ticket();
    ticket.setFb_user_id(user.getUid());
    ticket.setEmail(email.getText().toString());
    ticket.setFirst_name(firstName.getText().toString());
    ticket.setLast_name(lastName.getText().toString());
    ticket.setProject("android");
    ticket.setType("design");
    ticket.setSubject(title.getText().toString());
    ticket.setDescription(description.getText().toString());

    api.createTicket(ticket).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<JsonElement>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(JsonElement jsonElement) {
                    Log.d(getTag(), "zzzOnNext");
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(getTag(), "err", e);
                }

                @Override
                public void onComplete() {

                }
            });

к

  JSONObject tickenJson= new JSONObject();

        Ticket ticket = new Ticket();
        ticket.setFb_user_id(user.getUid());
        ticket.setEmail(email.getText().toString());
        ticket.setFirst_name(firstName.getText().toString());
        ticket.setLast_name(lastName.getText().toString());
        ticket.setProject("android");
        ticket.setType("design");
        ticket.setSubject(title.getText().toString());
        ticket.setDescription(description.getText().toString());

ticketJson.put("fb_user_id",user.getUid());
ticketJson.put("email",email.getText().toString());
ticketJson.put("first_name",firstName.getText().toString());
ticketJson.put("last_name",lastName.getText().toString());
ticketJson.put("project","android");
ticketJson.put("type","design");
ticketJson.put("type",title.getText().toString());
ticketJson.put("description",description.getText().toString());
     api.createTicket(ticketJson.toString()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<JsonElement>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(JsonElement jsonElement) {
                        Log.d(getTag(), "zzzOnNext");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(getTag(), "err", e);
                    }

                    @Override
                    public void onComplete() {

                    }
                });

JsonObject.put не является допустимым методом. Вы могли иметь в виду ticketJson.addProperty?

Paxana Non Grata 27.10.2018 01:28

в android есть два класса для JSON. да, ticketJson.addProperty равно ticketJson.put

Momen Zaqout 27.10.2018 01:30

После этого я получаю ответ Data: "@ \" fb_user_id \ ": \" CSLbKEtCMqf4py73Gih2udifxq73 \ ", \" email \ ": ‌ \" [email protected] \ ", \ ‌" first_name \ ": \ "Firs‌ t \", \ "last_name \": \ "Last \", \ "project \": \ "design \", \ "subject \" ‌: \ "Demo \", \ "descript‌ ion \ ": \" Фиктивный текст \ ""

Paxana Non Grata 27.10.2018 01:39

используйте "JSONObject", это еще один класс для JSON. см. обновление ответа

Momen Zaqout 27.10.2018 01:46

Не забудьте добавить заголовок

Momen Zaqout 27.10.2018 02:01

изменил его с JsonObject на JSONObject, addproperty to put, добавил заголовок @Headers ({"Content-Type: application / json", "Cache-Control: max-age = 640000"}) до метода модернизации и получил тот же результат

Paxana Non Grata 27.10.2018 02:09

Позвольте нам продолжить обсуждение в чате.

Paxana Non Grata 27.10.2018 02:21

Другие вопросы по теме