簡體   English   中英

Gson:應為字符串,但為 BEGIN_OBJECT

[英]Gson: Expected a string but was BEGIN_OBJECT

我正在嘗試閱讀一個簡單的 JSON 響應:

{
  "response": "ok"
}

這是我的代碼:

JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
String response = null;
boolean success = false;
reader.beginObject();
if (reader.hasNext()) {
  String token = reader.nextName();
  if (token.equals("response")) {
    response = reader.nextString();
  } else {
    reader.skipValue();
  }
}
reader.endObject();
reader.close();

但我收到此錯誤:

java.lang.IllegalStateException:應為STRING ,但為BEGIN_OBJECT

我不明白我做錯了什么。

你的解析器很好 如果您提供的代碼片段確實屬於您獲得的異常堆棧跟蹤,那么我相信您嘗試解析的 JSON 的response屬性具有字符串以外的值。 例如,

{ "response": "ok" }

可以由您的解析器解析就好了。 但是,您可以使用解析器獲得的最接近的異常消息是類似於以下的 JSON:

{ "response": {"status": "ok"} }

那應該會失敗,例如

線程“main”java.lang.IllegalStateException 中的異常:應為字符串,但在第 1 行第 16 列路徑 $.response 處為 BEGIN_OBJECT

另請注意,Gson 至少在其最新版本中報告了有問題的位置(我使用 Gson 2.5 對其進行了測試)。 只要確保你得到預期的輸入。 如果您認為響應必須采用您提到的格式,那么只需嘗試跟蹤輸入流並找出差異。 以最簡單但不是最有效的實現方式跟蹤輸入流,您可以使用更高效的跟蹤閱讀器,如下所示:

private static Reader traceReader(final Reader reader) {
    return new Reader() {
        @Override
        public int read(final char[] buffer, final int offset, final int length)
                throws IOException {
            final int read = reader.read(buffer, offset, length);
            if ( read != -1 ) {
                // or any other appropriate tracing output here
                out.print(new String(buffer, offset, read));
                out.flush();
            }
            return read;
        }

        @Override
        public void close()
                throws IOException {
            reader.close();
        }
    };
}

和:

JsonReader reader = new JsonReader(traceReader(new InputStreamReader(in, "UTF-8")))

然后重新檢查你是否真的得到{ "response": "ok" }

只是在這里添加這個。 就我而言,我收到此錯誤是因為我試圖將 JSON 對象直接解析為 ENUM。 GSON 期望直接使用字符串而不是 JSON 對象。

就我而言,我犯了一個錯誤建模響應。 我的錯誤是一個對象,我將它建模為一個字符串。 仔細查看我的 API 響應並建模修復它

解決此問題的想法類似於以下示例:您的 JSON 說 dCharg 是 object,而不是字符串:

"dCharg":{"TEXT":1000}

如果它應該是一個字符串,它會看起來像:

"dCharg":"1000"

也許你可以設計如下 {code:java}

公共 class BaseEmployee{/* 東西 */}

public class RegularEmployee 擴展 BaseEmployee{/* 東西 */}

公共 class 承包商擴展 BaseEmployee{/* 東西 */} {code}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM