Подтвердить что ты не робот

"Ожидалось 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

4b9b3361

Ответ 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 и переменными все в порядке, проверьте запросы к базе данных... даже если данные правильно сохранены в БД, здесь может быть реальная проблема... перепроверьте свои запросы и попробуйте снова. Надеюсь, это поможет