it-swarm.com.ru

"Ожидается BEGIN_OBJECT, но в строке 1 столбца 1 указано значение STRING"

У меня есть этот метод:

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, но в строке 1 столбца 1 указано STRING

66
Crapo Wolf

Даже не видя вашу строку JSON, вы можете сказать из сообщения об ошибке, что это не правильная структура, которая будет проанализирована в экземпляре вашего класса.

Gson ожидает, что ваша строка JSON начнется с открывающей фигурной скобки. например 

{

Но строка, которую вы ей передали, начинается с открытых кавычек

"
120
bhspencer

Неправильный JSON с сервера всегда должен быть ожидаемым вариантом использования. Миллион вещей может пойти не так во время передачи. Gson немного хитрый, потому что вывод ошибок даст вам одну проблему, а фактическое исключение будет другого типа.

Учитывая все это, правильное исправление на стороне клиента

try
{
  gson.fromJSON(ad, Ad.class);
  //...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
  //...

Если вы хотите узнать, почему JSON, полученный вами с сервера, неверен, вы можете заглянуть внутрь блока catch для исключения. Но даже если это ваша проблема, клиент не обязан исправлять JSON, который он получает из Интернета.

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

Если вы собираетесь попробовать еще раз, я настоятельно рекомендую установить флаг внутри блока try/catch, а затем ответить на этот флаг за пределами блока try/catch. Скорее всего, благодаря вложенной попытке/отлову Gson втянул нас в этот беспорядок, поскольку трассировка нашего стека и исключения не совпадают.

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

boolean failed = false;

try
{
  gson.fromJSON(ad, Ad.class);
  //...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
  failed = true;
  //...
}

if (failed)
{
  //...
10
Jessica Pennell

В 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);

}

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) {
}

}

Ссылка: [ Как POST обработать весь JSON в теле запроса на модификацию?

3
Raj008

Возможно, ваш JSON Object верен, но полученный вами ответ не является вашими действительными данными. Как и при подключении неверного WiFi, вы можете получить странный ответ < html>.....< /html>, который GSON не может проанализировать.

вам может понадобиться сделать try..catch.. для этого странного ответа, чтобы избежать сбоя.

2
BrantYu

Я пришел, чтобы поделиться решением. Ошибка произошла со мной после того, как заставил notbook повесить трубку. возможное решение clean preject.

0
Wallace Roberto

В моем случае я возвращаю объект JSON как 

{"data": "", "message": "Посещаемость сохранена Успешно .. !!!", "status": "success"}

Решено, изменив его как 

{"data": {}, "message": "Посещаемость сохранена Успешно .. !!!", "status": "success"}

Здесь данные являются вложенным JsonObject и должны начинаться с {not "" 

0
RAJESH KUMAR ARUMUGAM

если с форматом json и переменными все в порядке, проверьте запросы к базе данных ... даже если данные правильно сохранены в БД, реальная проблема может быть там ... перепроверьте ваши запросы и попробуйте снова .. Надеюсь, это поможет

0
Shabbir Ahmed

Убедитесь, что у вас есть DESERIALIZED объекты, такие как DATE/DATETIME и т.д. Если вы отправляете JSON напрямую, не десериализовав его, то это может вызвать эту проблему.

0
Ravi Wadje

Не используйте jsonObject.toString для объекта JSON.

0
Solomon Fissehaye