【问题标题】:GSON parsing a JSON stringGSON 解析 JSON 字符串
【发布时间】:2019-09-25 12:26:06
【问题描述】:

我正在尝试通过 android 中的 gson 解析 php 中的 json 字符串,但一直出错

在 php 脚本中我有

return json_encode(["valid"=>true,"token"=>$tokenUser->token]);

在我的 android 上我有响应方法

void onApiResponse(String response){
 Log.i("test", response) //gives "{\"valid\":false,\"token\":null}"

 //using gson below
VerificationResponse verificationResponse = new Gson().fromJson(response,VerificationResponse.class);

}

我的验证响应类有

    private class VerificationResponse{
    private Boolean valid;
    private String token;

    public Boolean getValid() {
        return valid;
    }

    public String getToken() {
        return token;
    }
}

每当我尝试通过 verificationResponse.getValid() 访问 isValid getter 时,都会出现错误

 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
  Expected BEGIN_OBJECT but was STRING

我错过了什么?

【问题讨论】:

  • 我经常用来验证我的模型和我的 JSON 是否彼此同步的一种方法是采用相反的方式。创建一个新的VerificationResponse,在那里填充它的两个字段,然后让 Gson 使用gson.toJson(yourVerificationResponse) 将其序列化为 JSON 并进行比较。我认为引号的"\" 转义很奇怪......
  • JSONObject jsonObject = new JSONObject(response); VerificationResponse 验证响应 = new Gson().fromJson(jsonObject,VerificationResponse.class);
  • @KishanMaurya JSONObject 应该是 JsonObject(如果您使用的是 Gson)。
  • @KishanMaurya 出现错误无法解析方法 fromJson(org.json.JSONOBJECT, class)
  • @MartinMarconcini 在使用 JsonObject 时出现错误 JsonObject cannot be applied to java.lang.String

标签: android json gson


【解决方案1】:
String Json_Header = "Content-Type: application/json;charset=UTF-8";
String Query_Header = "Content-Type: application/x-www-form-urlencoded";

API接口

@POST("Get_Watch_List")
@Headers({Query_Header})
Call<String> GetWatchList(@Query("Token") String Token);

呼叫服务

  ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
        Call<String> call = apiService.GetWatchList(GlobalApp.Token);
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                try {
                    Gson gson = new Gson();
                    VerificationResponse verificationResponse = gson.fromJson(response.body(), VerificationResponse.class);
                    if (verificationResponse.getValid().equals("true")) {
                        // here your code
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {

            }
        });

【讨论】:

    【解决方案2】:

    要将对象序列化为 Json(而不是 FROM Json)并验证您的模型/json 是否一起工作,尝试查看对象首先如何序列化并进行比较非常容易。

    所以(在 ​​Kotlin 中因为它更短):

    import android.util.Log
    import com.google.gson.Gson
    
    data class Thing(val value: Boolean, val token: String)
    
    class SerializeMyThing {
        init {
            val thing = Thing(true, "token2")
            val gson = Gson()
            val thingAsJsonString = gson.toJson(thing, Thing::class.java)
    
            Log.d("THING", thingAsJsonString)
    
        }
    }
    

    Thing 是我的模型,它需要一个值(布尔值)和一个称为令牌的字符串,就像你的一样。

    然后我简单地创建了一个 Gson 实例并调用了 toJson...

    这是上面的输出:

    D/THING: {"token":"token2","value":true}

    如果你想返回一个对象(这是你想要做的),在第一个日志之后添加这个来验证它是否正常工作:

            // back to Object from the thingAsJson:
            val newThing = gson.fromJson(thingAsJsonString, Thing::class.java)
            Log.d("THING", "Value: " + newThing.value + " | token: " + newThing.token)
    

    打印(如预期):

    D/THING: Value: true | token: token2

    我认为您遇到的问题是您从服务器获取的 Json 格式:

    根据您的问题,它看起来像这样:

    "{\"valid\":false,\"token\":null}"

    我认为应该更像:

    {"valid":false,"token":null}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多