"Ожидалось BEGIN_OBJECT, но было STRING в строке 1 столбца 1"
У меня есть этот метод:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
И я хочу разобрать JSON с помощью
public static void addObject(String IP, Object addObject) {
try {
String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
addObject = ConfigJSONParser.parseStringToObject(json);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Но я получаю сообщение об ошибке:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Ожидаемый BEGIN_OBJECT, но был STRING в строке 1 столбца 1
Ответы
Ответ 1
Даже не увидев строку JSON, вы можете сообщить из сообщения об ошибке, что не соответствующая структура не будет проанализирована в экземпляр вашего класса.
Gson ожидает, что ваша строка JSON начнется с скобки открытия объекта. например
{
Но строка, которую вы передали ей, начинается с открытых кавычек
"
Ответ 2
Неправильный JSON с сервера всегда должен быть ожидаемым вариантом использования. Во время передачи может произойти ошибка в миллионе. Gson немного сложнее, потому что его вывод ошибки даст вам одну проблему, и фактическое исключение, которое вы поймаете, будет иметь другой тип.
Учитывая все это, правильное исправление на стороне клиента
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
//...
Если вы хотите знать, почему JSON, полученный с сервера, ошибочны, вы можете заглянуть внутрь своего блока catch за исключением. Но даже если это ваша проблема, это не обязанность клиента исправить JSON, который он получает из Интернета.
В любом случае, ответственность клиента заключается в том, чтобы решить, что делать, когда он становится плохим JSON. Две возможности отклоняют JSON и ничего не делают, и снова пытаются.
Если вы попытаетесь снова, я настоятельно рекомендую установить флаг внутри блока try/catch и затем отвечать на этот флаг вне блока try/catch. Вложенные try/catch, вероятно, как Gson попал в этот беспорядок с нашей трассировкой стека и исключениями, которые не совпадают.
Другими словами, хотя я признаю, что это выглядит не очень элегантно, я бы рекомендовал
boolean failed = false;
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
failed = true;
//...
}
if (failed)
{
//...
Ответ 3
В Retrofit2, когда вы хотите отправить свои параметры в сыром виде, вы должны использовать скаляры.
сначала добавьте это в ваш gradle:
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'
public interface ApiInterface {
String URL_BASE = "http://10.157.102.22/rest/";
@Headers("Content-Type: application/json")
@POST("login")
Call<User> getUser(@Body String body);
}
мой SampleActivity:
public class SampleActivity extends AppCompatActivity implements Callback<User> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.URL_BASE)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// prepare call in Retrofit 2.0
try {
JSONObject paramObject = new JSONObject();
paramObject.put("email", "[email protected]");
paramObject.put("pass", "4384984938943");
Call<User> userCall = apiInterface.getUser(paramObject.toString());
userCall.enqueue(this);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onResponse(Call<User> call, Response<User> response) {
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
}
Ссылка: [ Как поместить весь JSON в тело запроса на модификацию?
Ответ 4
Возможно, ваш JSON Object
прав, но полученный вами ответ не является вашими действительными данными. Как и при подключении недействительного WiFi
, вы можете получить странный ответ < html>.....< /html>
, который GSON
не может проанализировать.
вам может понадобиться сделать try..catch..
для этого странного ответа, чтобы избежать сбоя.
Ответ 5
Я пришел, чтобы поделиться решением. Ошибка произошла со мной после того, как заставил notbook повесить трубку. Возможное решение clean preject
.
Ответ 6
Не используйте jsonObject.toString
для объекта JSON.
Ответ 7
Убедитесь, что у вас есть DESERIALIZED объекты, такие как DATE/DATETIME и т.д. Если вы отправляете JSON напрямую, не десериализовав его, то это может вызвать эту проблему.
Ответ 8
В моем случае я возвращаю объект JSON как
{"data": "", "message": "Посещаемость успешно сохранена.. !!!", "status": "success"}
Решено, изменив его как
{"data": {}, "message": "Посещаемость успешно сохранена.. !!!", "status": "success"}
Здесь данные являются вложенным JsonObject и должны начинаться с {not ""
Ответ 9
если с форматом json и переменными все в порядке, проверьте запросы к базе данных... даже если данные правильно сохранены в БД, здесь может быть реальная проблема... перепроверьте свои запросы и попробуйте снова. Надеюсь, это поможет