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();
                }