【问题标题】:Using Gson fromJson method not working使用 Gson fromJson 方法不起作用
【发布时间】:2016-04-11 15:54:01
【问题描述】:

我有一个 json 字符串,如下所示:

 "{"RequestId":255,
  "RequestTime":"2016-04-08T17:00:40.327",
  "Otp":"123456",
  "AppName":"This is my app name",
  "IsAwaitingResponse":false}"

我还有一个下面的类对象,我希望使用 Gson 库 fromJson() 方法创建它...

public class AccessRequest{
    public int Id;
    public String RequestTime;
    public String Otp;
    public String AppName;
    public Boolean IsAwaitingResponse;
}

现在,当我调用 gson.fromJson 方法时,它不会出错,但我的对象没有被设置。这是我正在使用的代码...

Gson gson = new Gson();
AccessRequest ar;
ar = gson.fromJson(jsonString, AccessRequest.class);

而是将我的 'ar' 变量设置为一些奇怪的 gson 对象,这显然是错误的,但不会引发错误。

{serializeNulls:falsefactories:[Factory[typeHierarchy=com.google.gson.JsonElement,adapter=com.google.gson.internal.bind.TypeAdapters$25@e8dad0a],

据我所见,我的 Json 字符串中没有错误(虽然我是 json 新手),所以我不太确定为什么这种方法不起作用...

【问题讨论】:

  • 你从哪里得到那个输出?是什么产生的?
  • 你能发布一个 MCVE 吗?
  • 包含该错误消息的异常是什么?请发布堆栈跟踪。
  • 我打赌你打印的是gson,而不是ar。投票结束是错字,无法重现。
  • RequestId 和 Id 应该相同,或者你使用@SerializedName注解..

标签: java json gson


【解决方案1】:

您可能打印了gson 对象而不是ar 对象,正如@Pillar 在 cmets 中指出的那样。

我已经尝试了您的示例,它按预期工作。此外,Id 字段未设置,因为属性名称不匹配。您应该使用@SerializedName 或更改任何名称。这在 cmets 中也有说明。

这是工作示例:

package net.sargue.gson;

import com.google.gson.Gson;
import org.intellij.lang.annotations.Language;

public class SO36553536 {
  public static void main(String[] args) {
    @Language("JSON")
    String json = "{\n" +
            "  \"RequestId\": 255,\n" +
            "  \"RequestTime\": \"2016-04-08T17:00:40.327\",\n" +
            "  \"Otp\": \"123456\",\n" +
            "  \"AppName\": \"This is my app name\",\n" +
            "  \"IsAwaitingResponse\": false\n" +
            "}";

    Gson gson = new Gson();
    AccessRequest ar;
    ar = gson.fromJson(json, AccessRequest.class);
    System.out.println("ar.getClass() = " + ar.getClass());
    System.out.println("ar = " + ar);
  }

  public class AccessRequest {
    public int Id;
    public String RequestTime;
    public String Otp;
    public String AppName;
    public Boolean IsAwaitingResponse;

    @Override
    public String toString() {
      return "AccessRequest{" + "Id=" + Id +
              ", RequestTime='" + RequestTime + '\'' +
              ", Otp='" + Otp + '\'' +
              ", AppName='" + AppName + '\'' +
              ", IsAwaitingResponse=" + IsAwaitingResponse +
              '}';
    }
  }
}

这是执行输出:

ar.getClass() = class net.sargue.gson.SO36553536$AccessRequest
ar = AccessRequest{Id=0
, RequestTime='2016-04-08T17:00:40.327'
, Otp='123456'
, AppName='This is my app name'
, IsAwaitingResponse=false}

【讨论】:

  • 此处的适当操作是投票/标记以关闭为不可重现。
【解决方案2】:

因为只需要从 Id 类 AccessRequest 中更改 RequestId。 你会得到正确的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多