gson.JsonSyntaxException: java.lang.IllegalStateException:

Я новичок в gson и получаю эту ошибку.

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: ожидалось BEGIN_OBJECT, но было BEGIN_ARRAY в строке 1, столбце 2527, путь $.data.batting[0].scores[1].dismissal-by

это из-за другого ответа json, предоставленного API.

это ответ json:

 "batting": [
  {
    "scores": [
      {
        "dismissal-by": {
          "name": "CE Rudd",
          "pid": "646213"
        },
        "dismissal": "stumped",
        "SR": 126,
        "6s": 0,
        "4s": 5,
        "B": 34,
        "R": 43,
        "dismissal-info": "st  Rudd b Kerr",
        "batsman": "NE Bolton",
        "pid": "267611"
      },
      {
        "dismissal-by": [
          {
            "name": "M du Preez",
            "pid": "54646"
          }
        ],
        "dismissal": "runout",
        "SR": 112,
        "6s": 0,
        "4s": 4,
        "B": 25,
        "R": 28,
        "dismissal-info": "run out (du Preez)",
        "batsman": "GEB Boyce",
        "pid": "874261"
      },
      {
        "dismissal-by": {
          "name": "LK Bell",
          "pid": "878025"
        },
        "dismissal": "catch",
        "SR": 100,
        "6s": 0,
        "4s": 2,
        "B": 27,
        "R": 27,
        "dismissal-info": "c Bell b Scholfield",
        "batsman": "AE Satterthwaite",
        "pid": "233007"
      },
      {
        "dismissal": "not out",
        "SR": 220,
        "6s": 2,
        "4s": 5,
        "B": 20,
        "R": 44,
        "dismissal-info": "not out",
        "batsman": "H Kaur",
        "pid": "372317"
      },
      {
        "dismissal": "not out",
        "SR": 100,
        "6s": 0,
        "4s": 1,
        "B": 14,
        "R": 14,
        "dismissal-info": "not out",
        "batsman": "E Threlkeld  ",
        "pid": "878035"
      },
      {
        "SR": "",
        "6s": "",
        "4s": "",
        "B": "",
        "R": "",
        "dismissal-info": "",
        "detail": "6 (b 1, w 5)",
        "batsman": "Extras",
        "pid": 0
      }
    ],
    "title": "Lancashire Thunder Innings"
  },

получение ошибки при 2-м увольнении по объекту.

1-е увольнение начинается с объекта, а второе увольнение-по объекту - массивом.

это класс Java для массива результатов

public class Score__ implements Serializable {

@SerializedName("dismissal-by")
@Expose
private DismissalBy dismissalBy;
@SerializedName("dismissal")
@Expose
private String dismissal;
@SerializedName("SR")
@Expose
private String sR;
@SerializedName("6s")
@Expose
private String _6s;
@SerializedName("4s")
@Expose
private String _4s;
@SerializedName("B")
@Expose
private String b;
@SerializedName("R")
@Expose
private String r;
@SerializedName("dismissal-info")
@Expose
private String dismissalInfo;
@SerializedName("batsman")
@Expose
private String batsman;
@SerializedName("pid")
@Expose
private Integer pid;
@SerializedName("detail")
@Expose
private String detail;

public DismissalBy getDismissalBy() {
    return dismissalBy;
}

public void setDismissalBy(DismissalBy dismissalBy) {
    this.dismissalBy = dismissalBy;
}

public String getDismissal() {
    return dismissal;
}

public void setDismissal(String dismissal) {
    this.dismissal = dismissal;
}

public String getSR() {
    return sR;
}

public void setSR(String sR) {
    this.sR = sR;
}

public String get6s() {
    return _6s;
}

public void set6s(String _6s) {
    this._6s = _6s;
}

public String get4s() {
    return _4s;
}

public void set4s(String _4s) {
    this._4s = _4s;
}

public String getB() {
    return b;
}

public void setB(String b) {
    this.b = b;
}

public String getR() {
    return r;
}

public void setR(String r) {
    this.r = r;
}

public String getDismissalInfo() {
    return dismissalInfo;
}

public void setDismissalInfo(String dismissalInfo) {
    this.dismissalInfo = dismissalInfo;
}

public String getBatsman() {
    return batsman;
}

public void setBatsman(String batsman) {
    this.batsman = batsman;
}

public Integer getPid() {
    return pid;
}

public void setPid(Integer pid) {
    this.pid = pid;
}

public String getDetail() {
    return detail;
}

public void setDetail(String detail) {
    this.detail = detail;
}

}

увольнение классом java

public class DismissalBy implements Serializable {

@SerializedName("name")
@Expose
private String name;
@SerializedName("pid")
@Expose
private String pid;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPid() {
    return pid;
}

public void setPid(String pid) {
    this.pid = pid;
}

}

как мне исправить эту проблему? любая помощь будет оценена


person Sreyash Gaonkar    schedule 19.08.2018    source источник
comment
Используемый вами API несовместим, попросите разработчика API исправить это. Хотя с этим API можно работать, добавляя некоторые патчи, я не рекомендую использовать несогласованный API.   -  person Nabin Bhandari    schedule 19.08.2018
comment
Возможный дубликат: stackoverflow.com/questions/9598707/   -  person Martin Zeitler    schedule 19.08.2018


Ответы (3)


в вашем объекте JSON есть

"dismissal-by": {
          "name": "LK Bell",
          "pid": "878025"
        },

вы не можете использовать его таким образом, поскольку вы объявляете его как массив, он должен оставаться там того же типа, потому что вам нужно изменить его на что-то вроде

  "dismissal-by"":[
    {
          "name": "LK Bell",
          "pid": "878025"
        }
    ]

,

чтобы решить эту проблему, вам нужно проанализировать все JSON вручную, например

Json json = new Json(string);
try{
json.getJsonArray("dismissal-by");
}catch(IllegalStateException e)
{
json.getObject("dismissal-by");  
}
person Mohammad Rbabah    schedule 19.08.2018
comment
как я могу пренебречь объектом увольнения и проанализировать оставшийся json с помощью gson? - person Sreyash Gaonkar; 19.08.2018
comment
@SreyashGaonkar Я не уверен, что ты сможешь это сделать - person Mohammad Rbabah; 19.08.2018
comment
@SreyashGaonkar пожалуйста, но в целом вы не должны с этим справляться, потому что API написан нестандартно, попробуйте связаться с веб-разработчиком - person Mohammad Rbabah; 19.08.2018
comment
поставщик API не готов изменить ответ API. пожалуйста, предложите мне другой способ решить эту проблему. - person Sreyash Gaonkar; 20.08.2018

что JSON недействителен... поэтому com.google.gson.JsonSyntaxException.

он должен начинаться с {, а после "title": "Lancashire Thunder Innings" отсутствует }].

там вы можете убедиться сами: https://jsonlint.com

person Martin Zeitler    schedule 19.08.2018
comment
json, который я предоставил, является частью более крупного ответа, я дал только небольшую часть, где я получаю сообщение об ошибке - person Sreyash Gaonkar; 19.08.2018
comment
@SreyashGaonkar, даже если начальный { мог быть усечен, отсутствующий }] все еще нарушает синтаксис; иначе GSON не стал бы жаловаться и не назвал бы это JsonSyntaxException. когда-нибудь пытались проверить весь ответ с помощью jsonlint? - person Martin Zeitler; 19.08.2018
comment
да, я поместил весь ответ json, который показывает, что он действителен - person Sreyash Gaonkar; 19.08.2018
comment
@SreyashGaonkar гласит: ожидал BEGIN_OBJECT, но был BEGIN_ARRAY в column 2527 ... что буквально переводится как: ожидал {, но нашел [. см. вопрос/ответы, добавленные выше; если JSON действителен, это, вероятно, причина. - person Martin Zeitler; 19.08.2018

Увольнение, которое вы получаете, - это некоторое время в формате массива (начинается с [ и заканчивается]), а некоторое время это объект Json {}, будет лучше разрешить его от разработчика API. Или вы можете объявить его как строку и выполнить синтаксический анализ позже, где это необходимо.

public class Score__ implements Serializable {

@SerializedName("dismissal-by")
@Expose
private String dismissalBy;}
person R7G    schedule 19.08.2018
comment
я связался с разработчиком API, посмотрим, что он ответит - person Sreyash Gaonkar; 19.08.2018
comment
есть ли способ, где я могу пренебречь объектом увольнения и прочитать оставшийся json с помощью gson ??? - person Sreyash Gaonkar; 19.08.2018
comment
просто попробуйте, как я упоминал выше, он будет анализировать увольнение как строку - person R7G; 19.08.2018
comment
затем вы можете проанализировать увольнение, где вам нужно, как это Object json = new JSONTokener(response).nextValue(); if (json instanceof JSONObject) // у вас есть объект else if (json instanceof JSONArray) - person R7G; 19.08.2018