Java GSON解析关于对象数组的JSON异常

Java GSON解析关于对象数组的JSON异常,java,arrays,json,gson,Java,Arrays,Json,Gson,我正在使用谷歌的GSON解析库,我不确定以前是否有人问过这个问题(我确实检查过我能找到什么),但是,我来了!!这是关于fromJSON方法,以及它如何拒绝将某些类解释为数组 考虑到下面的JSON结构: {"visualization": { "root": { "fullname": "CC/dudu", "name": "dudu", "type": "String", "children": [ { "fullname"

我正在使用谷歌的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
}
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);


   }

}

下面的代码允许您精确解析JSON

请注意,我将所有内容都放在一个类中,以便于您进行测试。无论如何,Gson不能很好地处理内部类,除非它们是静态的。所以我建议您为每个类创建一个文件,或者只使用静态内部类

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


   }

}
package stackoverflow.questions;
导入java.util.*;
导入com.google.gson.gson;
公共类Q20461706{
公共类跟踪{
ArrayList消息;
阵列列表场景;
@凌驾
公共字符串toString(){
返回“Trace[messages=“+messages+”,scenarios=“+scenarios+”];
}
}
公共静态类消息{
字符串from;/“from”:“dudu”,
字符串方法;/“方法”:“call()”,
字符串scenario;/“scenario”:“#1”,
字符串时间戳;/“时间戳”:“09-12-2013 00:21:14”,
字符串to;/“to”:“dudu”,
字符串类型;/“类型”:“void”,
布尔冲突;/“冲突”:“真”,
布尔可见;/“可见”:“真”
@凌驾
公共字符串toString(){
返回“Message[from=“+from+”,method=“+method+”,scenario=“+scenario+”,timestamp=“+timestamp+”,to=“+to+”,type=“+type+”,invalition=“+invalition+”,visible=“+visible+””;
}
}
公共静态类场景{
字符串名称;/“名称”:“testscenario”,
字符串id;/“id”:“#1”,
字符串说明;/“说明”:“正在测试解析!”
@凌驾
公共字符串toString(){
return“Scenario[name=“+name+”,id=“+id+”,description=“+description+””;
}
}
公共静态类组件{
字符串fullname;/“fullname”:“CC/dudu”,
字符串名称;/“名称”:“dudu”,
字符串类型;/“类型”:“字符串”,
列出儿童名单;
@凌驾
公共字符串toString(){
返回“Component[fullname=“+fullname+”,name=“+name+”,type=“+type+”,children=“+children+”””;
}
}
公共静态类可视化{
组分根;
痕迹;
@凌驾
公共字符串toString(){
返回“可视化[root=“+root+”,traces=“+traces+”]”;
}
}
公共静态类响应{
可视化;
@凌驾
公共字符串toString(){
返回“Response[visualization=“+visualization+”]”;
}
}
公共静态void main(字符串[]args){
字符串json=
“{\”可视化\“:{”+
“\”根\“:{”+
“\”全名“:\”抄送/杜杜“,”+
“\'name\:\'dudu\”,”+
“\”类型\“:\”字符串\“+
“\'children\”:[”+
"            {                                            "+
“\”全名“:\”CC/dudu/lulu\”+
“\'name\':\'lulu\',”+
“\”类型“:\”字符串“+
"            }                                            "+
"        ]                                                "+
"    },                                                   "+
“\“traces\”:{”+
“\“消息\”:[”+
"            {                                            "+
“\”from\“:\”dudu\“,”+
“\”方法\“:\”调用()\”,“+
“\”场景\:\“\”1\”+
“\“时间戳\”:\“09-12-2013 00:21:14\”,”+
“\”to\:\”嘟嘟“+
“\”类型\“:\”无效\“+
“\”违反“:\”正确“,”+
“\”可见“:\”真实“+
"            }                                            "+
"        ],                                               "+
“\“场景\”:[”+
"            {                                            "+
“\”名称\“:\”测试方案\“,”+
“\“id\”:\“\”1\“,”+
“\”说明\“:\”测试解析!\“”+
"            }                                            "+
"        ]                                                "+
"    }                                                    "+
"    }}                                                   ";
Gson gsonParser=new Gson();
Response r=gsonParser.fromJson(json,Response.class);
系统输出println(r);
}
}
为了回答您的问题,请注意,我将您的
可视化
类更改为
跟踪
,因为您的JSON中只有一个
跟踪
对象,而没有数组。这就是格森抱怨的原因


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

向我们展示尝试解析该JSON的代码。请注意,您缺少一个结束语
}
。事实上我没有,但感谢问题中的输入错误警告!让我们把所有的牌都摆在桌面上。发布你的
可视化
和(我想象)<