Ошибка говорит о том, что тело не является допустимым JSON.
Это был ожидаемый ответ от сервера. Допустим, ниже приведено ваше тело JSON, которое вы хотите отправить,
{
"key_1" : "value 1",
"key_2" : "value 2",
}
Когда вы используете JsonObject#toString()
, оно станет таким
{\"key_1\" : \"value 1\", \"key_2\" : \"value 2\"}
Если вы отправите данные / тело выше JSON на сервер, он будет обрабатываться сервером как обычная строка.
Тем не менее, вам нужно использовать toString()
здесь, потому что MediaType#parse()
не принимает JsonObject
параметров.
Какое решение?
Как отметил Ишан Фернандо в своем комментарии , вам нужно создать собственный класс POJO, чтобы подготовить тело JSON для запроса. Или используйте HashMap
для подготовки тела.
Создать POJO, как показано ниже
import com.google.gson.annotations.SerializedName;
public class Data {
@SerializedName("Text")
private String text;
public Data(String text) {
this.text = text;
}
// getter and setter methods
}
и используйте его
Data data = new Data("text value to translate"); // construct object
Call<TranslationResultDTO> call = api.getTranslation(data); // change method parameter
А также настроить параметр метода в интерфейсе API
Call<TranslationResultDTO> getTranslation(@Body final Data text); // change method parameter
Редактировать 1
Я просмотрел документацию, приложенную к вашему вопросу. Я сделал небольшую ошибку. Тело JSON должно содержать JSONArray, а не JSONObject. Как ниже
[
{
"Text" : "text to translate"
}
]
Измените параметр метдо на List<Data>
в интерфейсе API
Call<TranslationResultDTO> getTranslation(@Body final List<Data> text); // change method parameter
Используйте, как показано ниже
Data data = new Data("text value to translate"); // construct object
List<Data> objList = new ArrayList<>();
objList.add(data);
Call<TranslationResultDTO> call = api.getTranslation(objList); // change method parameter
Редактировать 2
А также API ответит JSONArray. Пример ответа
[
{
"detectedLanguage": {
"language": "en",
"score": 1.0
},
"translations": [
{
"text": "Hallo Welt!",
"to": "de"
},
{
"text": "Salve, mondo!",
"to": "it"
}
]
}
]
Создание нижеуказанных классов POJO для правильного анализа ответа JSON
Translation.java
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Translation {
@SerializedName("text")
@Expose
private String text;
@SerializedName("to")
@Expose
private String to;
// constructors, getter and setter methods
}
DetectedLanguage.java
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class DetectedLanguage {
@SerializedName("language")
@Expose
private String language;
@SerializedName("score")
@Expose
private float score;
// constructors, getter and setter methods
}
И, наконец, настройте TranslationResultDTO.java класс, как показано ниже.
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class TranslationResultDTO {
@SerializedName("detectedLanguage")
@Expose
private DetectedLanguage detectedLanguage;
@SerializedName("translations")
@Expose
private List<Translation> translations = null;
// constructors, getter and setter methods
}
Интерфейсный класс
Call<List<TranslationResultDTO>> call = api.getTranslation(objList); // change method parameter