2015-02-09 97 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?

相关问题