【问题标题】:GSON parsing fromJSON regarding arrays of objects exceptionGSON 解析 fromJSON 关于对象数组异常
【发布时间】:2013-12-09 01:43:05
【问题描述】:

我正在使用 google 的 GSON 解析库,但我不确定之前是否有人问过这个问题(我确实检查过我能找到什么)但是,我开始了!这是关于 fromJSON 方法以及它如何拒绝将某些类解释为数组。

鉴于以下 JSON 结构:

{"visualization": {
"root": {
    "fullname": "CC/dudu",
    "name": "dudu",
    "type": "String",
    "children": [
        {
            "fullname": "CC/dudu/lulu",
            "name": "lulu",
            "type": "String"
        }
    ]
},
"traces": {
    "messages": [
        {
            "from": "dudu",
            "method": "call()",
            "scenario": "#1",
            "timestamp": "09-12-2013 00:21:14",
            "to": "dudu",
            "type": "void",
            "violation": "true",
            "visible": "true"
        }
    ],
    "scenarios": [
        {
            "name": "testscenario",
            "id": "#1",
            "description": "testing parsing!"
        }
    ]
}
}}

以及随附的包含类。

public class Response {
private Visualization visualization;
    //+getter/setter
}

public class Visualization {
private Component root;
private Map<String, Trace> traces;
    //+getter/setter
} 

public class Trace {
private ArrayList<Message> messages;
private ArrayList<Scenario> scenarios;
    //+getter/setter
}

我收到 GSON 期望的是对象而不是数组的错误(在消息的“[”标记之前)。有谁知道这是为什么?类型(可以在类中看到)是List,所以应该没问题。而且我尝试在数组中添加更多对象,但仍然收到相同的错误消息!为什么 Gson 将 List&lt;TypeA&gt; 类型解释为对象而不是数组?

编辑: 这是代码代码,但这有点毫无意义,因为解析过程会引发异常。我怀疑你会发现任何有用的东西。 “可视化”是一个具有正确 JSON 格式的字符串。

Gson gsonParser = new Gson();
Response r = gsonParser.fromJson(visualization, Response.class);

【问题讨论】:

  • 向我们展示尝试解析该 JSON 的代码。
  • 请注意,您缺少一个结束}
  • 我实际上不是,但感谢问题中的错字警告!
  • 让我们把所有的牌都放在桌子上。发布您的Visualization 和(我想)Traces 课程。我想重现你所看到的。
  • 是的,就是这样!以前没有问题,我总是用 JSONLint 检查。但是,这一次我在开始之前有一个右大括号,而最后缺少一个。谢谢,就是这样!!!

标签: java arrays json gson


【解决方案1】:

下面的代码可让您准确解析 JSON。

请注意,我将所有内容放入一个类中,以便您更轻松地对其进行测试。无论如何,Gson 不能很好地与内部类一起工作,除非它们是静态的。所以我建议你为每个类制作一个文件或只使用静态内部类。

package stackoverflow.questions;

import java.util.*;

import com.google.gson.Gson;

public class Q20461706 {

   public class Trace {
      ArrayList<Message> messages;
      ArrayList<Scenario> scenarios;
      @Override
      public String toString() {
         return "Trace [messages=" + messages + ", scenarios=" + scenarios + "]";
      }

   }

   public static class Message {
      String from; // "from": "dudu",
      String method; // "method": "call()",
      String scenario; // "scenario": "#1",
      String timestamp; // "timestamp": "09-12-2013 00:21:14",
      String to; // "to": "dudu",
      String type; // "type": "void",
      Boolean violation; // "violation": "true",
      Boolean visible; // "visible": "true"
      @Override
      public String toString() {
         return "Message [from=" + from + ", method=" + method + ", scenario=" + scenario + ", timestamp=" + timestamp + ", to=" + to + ", type=" + type + ", violation=" + violation + ", visible=" + visible + "]";
      }


   }

   public static class Scenario {
      String name;// "name": "testscenario",
      String id; // "id": "#1",
      String description; // "description": "testing parsing!"
      @Override
      public String toString() {
         return "Scenario [name=" + name + ", id=" + id + ", description=" + description + "]";
      }

   }

   public static class Component {
      String fullname; // "fullname": "CC/dudu",
      String name; // "name": "dudu",
      String type; // "type": "String",
      List<Component> children;
      @Override
      public String toString() {
         return "Component [fullname=" + fullname + ", name=" + name + ", type=" + type + ", children=" + children + "]";
      }

   }

   public static class Visualization {
      Component root;
      Trace traces;
      @Override
      public String toString() {
         return "Visualization [root=" + root + ", traces=" + traces + "]";
      }

   }

   public static class Response {
      Visualization visualization;

      @Override
      public String toString() {
         return "Response [visualization=" + visualization + "]";
      }

   }

   public static void main(String[] args) {
      String json = 
     " {\"visualization\": {                                   "+
     "    \"root\": {                                          "+
     "        \"fullname\": \"CC/dudu\",                       "+
     "        \"name\": \"dudu\",                              "+
     "        \"type\": \"String\",                            "+
     "        \"children\": [                                  "+
     "            {                                            "+
     "                \"fullname\": \"CC/dudu/lulu\",          "+
     "                \"name\": \"lulu\",                      "+
     "                \"type\": \"String\"                     "+
     "            }                                            "+
     "        ]                                                "+
     "    },                                                   "+
     "    \"traces\": {                                        "+
     "        \"messages\": [                                  "+
     "            {                                            "+
     "                \"from\": \"dudu\",                      "+
     "                \"method\": \"call()\",                  "+
     "                \"scenario\": \"#1\",                    "+
     "                \"timestamp\": \"09-12-2013 00:21:14\",  "+
     "                \"to\": \"dudu\",                        "+
     "                \"type\": \"void\",                      "+
     "                \"violation\": \"true\",                 "+
     "                \"visible\": \"true\"                    "+
     "            }                                            "+
     "        ],                                               "+
     "        \"scenarios\": [                                 "+
     "            {                                            "+
     "                \"name\": \"testscenario\",              "+
     "                \"id\": \"#1\",                          "+
     "                \"description\": \"testing parsing!\"    "+
     "            }                                            "+
     "        ]                                                "+
     "    }                                                    "+
     "    }}                                                   ";

      Gson gsonParser = new Gson();

      Response r = gsonParser.fromJson(json, Response.class);

      System.out.println(r);


   }

}

为了回答您的问题,请注意我将您的 Visualization 类更改为 Trace traces,因为您的 JSON 中只有一个 Trace 对象而不是数组。这就是 Gson 抱怨的原因。

还请注意,我避免将日期解析为日期,您需要为此指定自定义日期格式,但这超出了此问题的范围。您可以在 SO 上找到许多示例。

【讨论】:

  • 它确实可以解析代码,但是,我之前的问题是 JSON 格式错误。从某种意义上说它不是我想要的 JSON 格式错误,但不知何故它是一个有效的 JSON 表示。另外,请注意,并非我所有的课程都在一个文件中。我只是这样发布它们以增加可读性。
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多