2015-02-09 82 views
32

我有這樣的方法:「預期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但STRING位於第1行第1列

+4

的樣子;你覺得它告訴你什麼? – fge 2015-02-09 20:26:13

+2

發佈您的發佈請求返回的JSON字符串。 – 2015-02-09 20:27:10

+0

發佈您的JSON字符串 – bhspencer 2015-02-09 20:33:38

回答

73

即使沒有看到您的JSON字符串,您可以從錯誤消息中知道它不是解析到您的類的實例的正確結構。

Gson期待您的JSON字符串以對象大括號開頭。例如

{ 

但你傳遞給它的字符串,以開放的報價

" 
+0

該方法的名稱可以說明原因。 'parseStringToObject'表明它期望一個總是以'{'開頭的JSON對象。 – yshavit 2015-02-09 20:41:29

+0

它以'{'或'['''開頭''' – devnull69 2016-11-15 21:51:05

+4

'''表示Json數組的開始而不是Json對象。 – bhspencer 2016-11-16 13:08:52

3

也許你JSON Object是正確的開始,但您收到的反應是不是你的,當您連接喜歡有效data.Just無效的WiFi,您可能會收到一個奇怪的迴應< html>.....< /html>GSON不能解析。

你可能需要做一些try..catch..這個奇怪的迴應,以避免崩潰。

6

服務器中的無效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) 
{ 
    //... 
+0

你救了我的命。 – viper 2018-01-19 12:03:45

1

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

}

參考:在錯誤信息仔細[How to POST raw whole JSON in the body of a Retrofit request?

相關問題