Java &引用;应为BEGIN“U对象,但在第1行第1列为字符串”;
我有这个方法:Java &引用;应为BEGIN“U对象,但在第1行第1列为字符串”;,java,json,parsing,gson,Java,Json,Parsing,Gson,我有这个方法: public static Object parseStringToObject(String json) { String Object = json; Gson gson = new Gson(); Object objects = gson.fromJson(object, Object.class); parseConfigFromObjectToString(object); return objects; } 我想用以下代码解
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_对象,但在第1行第1列为字符串
即使没有看到您的JSON字符串,您也可以从错误消息中看出它不是要解析到类实例中的正确结构 Gson希望您的JSON字符串以一个对象大括号开头。e、 g
{
但是您传递给它的字符串以一个开引号开始
"
也许你的
JSON对象是正确的,但是你收到的响应不是你的有效数据。就像当你连接无效的WiFi
时,你可能会收到一个奇怪的响应…
,GSON
无法解析
对于这个奇怪的响应,您可能需要执行一些try..catch..
,以避免崩溃。来自服务器的无效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)
{
//...
在第2种情况下,当您想以原始格式发送参数时,必须使用标量
首先将此项添加到您的渐变中:
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);
}
编译'com.squareup.Refught2:Refught2.3.0'
编译'com.squareup.Refught2:converter gson:2.3.0'
编译'com.squareup.Refught2:转换器标量:2.3.0'
公共接口{
字符串URL_BASE=”http://10.157.102.22/rest/";
@标题(“内容类型:application/json”)
@发布(“登录”)
调用getUser(@Body字符串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", "sample@gmail.com");
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) {
}
}
公共类SampleActivity扩展AppCompative实现回调{
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_示例);
改装改装=新改装.Builder()
.baseUrl(apinterface.URL\u BASE)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface ApiInterface=reformation.create(ApiInterface.class);
//准备呼叫改装2.0
试一试{
JSONObject paramObject=新的JSONObject();
paramObject.put(“电子邮件”sample@gmail.com");
paramObject.put(“通过”、“4384984938943”);
Call userCall=apinterface.getUser(paramObject.toString());
userCall.enqueue(this);
}捕获(JSONException e){
e、 printStackTrace();
}
}
@凌驾
公共void onResponse(调用、响应){
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
}
参考:[不要在JSON对象上使用jsonObject.toString
。请确保您已反序列化了日期/日期时间等对象。如果您直接发送JSON而未反序列化,则可能会导致此问题。我来分享一个解决方案。在强制挂断notbook后,错误发生在我身上。可能的解决方案cleanproject
在我的例子中,我将JSON对象返回为
{“数据”:“”“消息”:“已保存考勤”
成功..!!!,“状态”:“成功”}
通过将其更改为
{“数据”:{},“消息”:“已保存考勤”
成功..!!!,“状态”:“成功”}
这里的数据是一个子JsonObject,它应该从{not”“开始,如果您的json格式和变量没有问题,那么请检查您的数据库查询…即使数据正确保存在db中,实际问题可能在那里…重新检查您的查询并重试..希望它对我的情况有所帮助,我有一个“模型”,由几个字符串参数组成,但有一个除外:它是字节数组字节[]
。
一些代码片段:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
上面的最后一行是
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
被触发。通过搜索SO,我意识到我需要某种形式的适配器来将我的BaseModel
转换为JsonObject。在模型中混合使用String
和byte[]
会使事情变得复杂。显然,Gson
并不喜欢这种情况
最后,我制作了一个适配器
,以确保字节[]
转换为Base64
格式。下面是我的适配器
类:
public class ByteArrayToBase64Adapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> {
@Override
public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return Base64.decode(json.getAsString(), Base64.NO_WRAP);
}
@Override
public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(Base64.encodeToString(src, Base64.NO_WRAP));
}
}
类似地,为了将模型转换为JSONObject,我使用了以下方法:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
代码所做的基本上是在转换为JSONObject的过程中,通过适配器将预期的类/对象(在本例中为字节[]
类)推送到适配器中。不要忘了首先使用Gson()将对象转换为Json
然后,您可以使用这个很棒的库轻松地将其转换回对象
val fromUser = Gson().fromJson(fromUserJson, User::class.java)
我有一个案例,我从一个手写的json文件中读取
val fromUser = Gson().fromJson(fromUserJson, User::class.java)
"{\"restaurant\":{\"id\":\"abc-012\",\"name\":\"good restaurant\",\"foodType\":\"American\",\"phoneNumber\":\"123-456-7890\",\"currency\":\"USD\",\"website\":\"website.com\",\"location\":{\"address\":{\"street\":\" Good Street\",\"city\":\"Good City\",\"state\":\"CA\",\"country\":\"USA\",\"postalCode\":\"12345\"},\"coordinates\":{\"latitude\":\"00.7904692\",\"longitude\":\"-000.4047208\"}},\"restaurantUser\":{\"firstName\":\"test\",\"lastName\":\"test\",\"email\":\"test@test.com\",\"title\":\"server\",\"phone\":\"0000000000\"}}}"
private String removeQuotesAndUnescape(String uncleanJson) {
String noQuotes = uncleanJson.replaceAll("^\"|\"$", "");
return StringEscapeUtils.unescapeJava(noQuotes);
}
MyObject myObject = new.Gson().fromJson(this.removeQuotesAndUnescape(uncleanJson));
@Headers("Content-Type: application/json")
@POST("CreateNewPost")
Call<Resp> createNewPost(@Body ParaModel paraModel);
@POST("CreateNewPost")
@FormUrlEncoded
Call<Resp> createNewPost(
@Field("user_id") Integer user_id,
@Field("user_name") String user_name,
@Field("description") String description,
@Field("tags") String tags);
This error solved for by replacing .toString method to .string on the response
toString => string (add in try{...code..}catche(IOException e))
below code is working for me
try {
MainModelResponse model;
Gson gson = new GsonBuilder().create();
if (response.code() == ConstantValues.SUCCESS_OK) {
model = gson.fromJson(response.body().string(), MainModelResponse.class);
} else {
model = gson.fromJson(response.errorBody().string(), MainModelResponse.class);
}
moduleData.postValue(model);
}catch (IllegalStateException | JsonSyntaxException | IOException exception){
exception.printStackTrace();
}