【问题标题】:Unable to deserialize the list of object data using GSON library无法使用 GSON 库反序列化对象数据列表
【发布时间】:2019-09-09 13:31:40
【问题描述】:

我有一个JSON Data,它是一组对象,如下所示。我必须将deserialize下面给定的数据放入对象列表中

[{\"Name\": \"Initialize\", \"Library\": \"BKS\", \"Type\": \"setup\", \"Status\": \"PASS\", \"StartTime\": \"20190429 15:06:36.020\", \"EndTime\": \"20190429 15:06:39.476\", \"Environment\": \"CLC-ER\", \"ScenarioName\": \"BKS-DISVAS\", \"ElapsedTime\": 456.0},{\"Name\": \"Initialize\", \"Library\": \"BKS\", \"Type\": \"setup\", \"Status\": \"PASS\", \"StartTime\": \"20190429 15:06:36.020\", \"EndTime\": \"20190429 15:06:39.476\", \"Environment\": \"CLC-ER\", \"ScenarioName\": \"BKS-DISVAS\", \"ElapsedTime\": 456.0}]

我尝试了以下代码 sn-p,但出现以下错误。

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at com.google.gson.Gson.fromJson(Gson.java:822) ~[gson-2.3.1.jar:na] at com.google.gson.Gson.fromJson(Gson.java:875) ~[gson-2.3.1.jar:na]

下面给出了我的模型类

public class KeywordDetails {

    public KeywordDetails() {
    }

    @JsonProperty("Name")
    public String Name;
    @JsonProperty("Type")
    public String Type;
    @JsonProperty("Library")
    public String Library;
    @JsonProperty("StartTime")
    public String StartTime;
    @JsonProperty("EndTime")
    public String EndTime;
    @JsonProperty("Status")
    public String Status;
    @JsonProperty("ScenarioName")
    public String ScenarioName;
    @JsonProperty("Environment")
    public String Environment;
    @JsonProperty("ElapsedTime")
    public double ElapsedTime;

}

反序列化代码如下,

    Gson serializer = new Gson();
    Type listType = new TypeToken<ArrayList<KeywordDetails>>() {
    }.getType();
    JsonParser parser = new JsonParser();
    JsonElement kwJson = parser.parse(ser.getKeywordStats());
    System.out.println(kwJson);

    List<KeywordDetails> keywordDetails = serializer.fromJson(kwJson, listType);

ser.getKeywordStats() 方法是给上面的JSON

我应该能够将deserializeJSON 放入对象列表或数组中。

由于我是 Java 新手,我无法找到此问题的根本原因或解决方法,谁能帮助我解决此问题?

【问题讨论】:

  • 我一直在谷歌搜索,找到了一种使用默认构造函数而不带任何参数的解决方案,我也添加了那个,但即使那样也无法反序列化。
  • 我也尝试将 JSON 字符串传递给 fromJson 方法,但它也不起作用。我在 Spring Boot 应用程序中使用它,还尝试了 Jackson 序列化程序,但也无法重现。
  • 你试过用 List 代替 ArrayList 吗?
  • 您传递的实际字符串是否包含所有转义反斜杠?因为您粘贴的字符串不是有效的 JSON。它必须没有 \
  • 我实际上是在将数据从 python 源发送到 java,在那里它碰巧对值进行了双重 json 编码。我不得不修复 python 代码,因为它导致 json 在内部被视为字符串,即使在解析字符串之后也是如此。修复 python 代码后,现在一切正常。感谢一个和所有帮助解决问题的人。简而言之,JSON字符串是罪魁祸首,在正确修复字符串后,现在一切正常。

标签: java json gson


【解决方案1】:
  1. 为什么选择 JsonProperty 而不是 SerializableName?你是在混合 Jackson 和 Gson 吗?
  2. ser.getKeywordStats() 的输出是什么?

因为我已经通过硬编码该 json 字符串而不是 ser.getKeywordStats() 来测试您的代码,并且它没有任何问题。

【讨论】:

  • 我实际上是在将数据从 python 源发送到 java,在那里它碰巧对值进行了双重 json 编码。我不得不修复python代码,因为它导致json在内部被视为字符串,即使在解析字符串之后也是如此。修复python代码后,现在一切正常。
【解决方案2】:

这是一个有效的 sn-p,

    private static final String ESCAPED_STRING =
          "[{\"Name\": \"Initialize\", \"Library\": \"BKS\", \"Type\": \"setup\", \"Status\": \"PASS\", \"StartTime\": \"20190429 15:06:36.020\", \"EndTime\": \"20190429 15:06:39.476\", \"Environment\": \"CLC-ER\", \"ScenarioName\": \"BKS-DISVAS\", \"ElapsedTime\": 456.0},{\"Name\": \"Initialize\", \"Library\": \"BKS\", \"Type\": \"setup\", \"Status\": \"PASS\", \"StartTime\": \"20190429 15:06:36.020\", \"EndTime\": \"20190429 15:06:39.476\", \"Environment\": \"CLC-ER\", \"ScenarioName\": \"BKS-DISVAS\", \"ElapsedTime\": 456.0}]";

      public static void main(String[] args) throws JsonProcessingException {
         Gson gson = new Gson();
         Type t= new TypeToken<List<KeywordDetails>>(){}.getType();
         JsonParser parser = new JsonParser();
         JsonElement jsonElements = parser.parse(ESCAPED_STRING);
         System.out.println(jsonElements);
         List<KeywordDetails> kd = gson.fromJson(jsonElements, t);
         System.out.println(kd);
      }

这与您的字符串有关,字符串必须没有 \ 斜杠才能使其成为有效的 JSON。因此,我使用 JsonParser 从转义的String 构造了一个有效的 JSON。

【讨论】:

    【解决方案3】:

    不要同时使用 Gson 或 JsonParser。 试试这段代码:

    Gson serializer = new Gson();
    Type listType = new TypeToken<ArrayList<KeywordDetails>>() {}.getType();
    List<KeywordDetails> keywordDetails = serializer.fromJson(ser.getKeywordStats(), listType);
    

    【讨论】:

      【解决方案4】:

      我不知道@JsonProperty 注释。您可以使用(或不使用)@SerializedName

      然后你可以像这样简单地反序列化你的json。

      String json = ...
      Gson gson = new Gson();
      List< KeywordDetails > keywords = gson.fromJson(json, new TypeToken<List< KeywordDetails >>(){}.getType());
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2018-10-25
        相关资源
        最近更新 更多