有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

json java gson fromjson返回非泛型的null

我以前见过有人讨论过这个话题,但我没见过有我特点的人。这个标题描述了我的情况。有两件事,我已经(我喜欢思考)过了所有可能的答案,这就是为什么我要写我自己的问题。第二件事,反序列化在另一个项目中工作得很完美,我照样复制(也许这就是问题所在)。我还检查了https://sites.google.com/site/gson/gson-user-guide#TOC-Writing-a-Deserializer,但我找不到我的代码有什么问题。以下是我到目前为止的情况: JSON:

{"offset":0,
"total":137,
"per-page":20,
"events":[
    {"id":286560,
    "name":"Arsenal vs Everton",
    "start":"2015-03-01T14:10:00.000Z",
    "status":"open",
    "sport-id":15,
    "category-id":[158208],
    "in-running-flag":true,
    "allow-live-betting":true,
    "market-ids":[1119280,1121697,1121698,1119271,1119299,1119587,1119288,1118302,1120869,1120870,1121696,1121900,1120868],
    "meta-tags":[
        {"id":402,
        "name":"Live Betting",
        "type":"COMPETITION"
        },
        {"id":19,
        "name":"England",
        "type":"COUNTRY"
        },
        {"id":32,
        "name":"Premier League",
        "type":"COMPETITION"
        },
        {"id":2285,
        "name":"March 1st 2015",
        "type":"DATE"
        },
        {"id":1,
        "name":"Sport",
        "type":"Root"
        },
        {"id":4,
        "name":"Soccer",
        "type":"SPORT"
        }]
    },
    {"id":286960,
    "name":"Norwich vs Ipswich Town",
    "start":"2015-03-01T14:10:00.000Z",
    "status":"open",
    "sport-id":15,
    "category-id":[158307],
    "in-running-flag":true,
    "allow-live-betting":true,
    "market-ids":[1121701,1121702,1122048,1120062,1120099,1121700,1120050,1120111,1120087,1121620],
    "meta-tags":[
        {"id":402,
        "name":"Live Betting",
        "type":"COMPETITION"
        },
        {"id":33,
        "name":"Championship",
        "type":"COMPETITION"
        },
        {"id":19,
        "name":"England",
        "type":"COUNTRY"
        },
        {"id":2285,
        "name":"March 1st 2015",
        "type":"DATE"
        },
        {"id":1,
        "name":"Sport",
        "type":"Root"
        },
        {"id":4,
        "name":"Soccer",
        "type":"SPORT"}]}
]}

班级:

public class Event {

private String id;
private String name;
private Date start;
private String status;
private String sportId;
private ArrayList<String> categoryId;
private boolean inRunningFlag;
private boolean allowLiveBetting;
private ArrayList<String> marketIds;
private List<MetaTags> metaTags;

public String getId(){
    return id;
}

public String getName(){
    return name;
}

public Date getStartDate(){
    return start;
}

public String getStatus(){
    return status;
}

public String getSportId(){
    return sportId;
}

public ArrayList<String> getCategoryId(){
    return categoryId;
}

public boolean getInRunningFlag(){
    return inRunningFlag;
}

public boolean getAllowLiveBetting(){
    return allowLiveBetting;
}

public ArrayList<String> getMarketIds(){
    return marketIds;
}

public List<MetaTags> getMetaTags(){
    return metaTags;
}

public void setId(String id){
    this.id = id;
}

public void setName(String name){
    this.name = name;
}

public void setStartDate(Date start){
    this.start = start;
}

public void setStatus(String status){
    this.status = status;
}

public void setSportId(String sportId){
    this.sportId = sportId;
}

public void setCategoryId(ArrayList<String> categoryId){
    this.categoryId = categoryId;
}

public void setInRunningFlag(boolean inRunningFlag){
    this.inRunningFlag = inRunningFlag;
}

public void setAllowLiveBetting(boolean allowLiveBetting){
    this.allowLiveBetting = allowLiveBetting;
}

public void setMarketIds(ArrayList<String> marketIds){
    this.marketIds = marketIds;
}

public void setMetaTags(List<MetaTags> metaTags){
    this.metaTags = metaTags;
}}

以及:

public class EventContainer extends Container{

private List<Event> result;

public List<Event> getResult(){
    return result;
}

public void setResult(List<Event> result){
    this.result = result;
}}

最后是从json到对象的转换过程

public List<Event> listEvents (String sessionToken) throws APIException{
    String result = getInstance().makeRequest(MatchBookApiCalls.LISTEVENTS.getApiCallName(), MatchBookApiCalls.LISTEVENTS.getURLSuffix(), sessionToken);

    EventContainer container = JsonConverter.convertFromJson(result, EventContainer.class);

    if(container.getError() != null)
        throw container.getError().getData().getAPIException();

    return container.getResult();
}

最后一点:

public class JsonConverter {

/**
 * We needed to override the adapter for the Date class so to make all dates to be serialized in ISO8601 UTC
 * Just formatting the string to the ISO format does not adjust by the timezone on the Date instance during serialization.
 */
private static final Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new ISO8601DateTypeAdapter()).create();

/** This method deserializes the specified Json into an object of the specified class.
 *
 */
public static  <T> T convertFromJson(String toConvert,  Class<T>  clazz){
    return gson.fromJson(toConvert, clazz); // this is failing horribly
}

/** This method deserializes the specified Json into an object of the specified Type.
 *
 */
public static  <T> T convertFromJson(String toConvert,  Type  typeOfT){
    return gson.fromJson(toConvert, typeOfT);
}

/**
 * This method serializes the specified object into its equivalent Json representation.
 */
public static String convertToJson(Object toConvert){
    return gson.toJson(toConvert);

}}

我已经为此挣扎了两天,所以也许我的大脑有点烧焦了,而答案是如此愚蠢,我会把头撞在墙上,但我就是看不见。哦错误是:

Exception in thread "main" java.lang.NullPointerException
at MatchBookApiJsonOperations.listEvents(MatchBookApiJsonOperations.java:46)
at MatchBookPlaceBet.getEvents(MatchBookPlaceBet.java:27)
at MatchBookConnection.testingEntities(MatchBookConnection.java:160)
at MatchBookMain.main(MatchBookMain.java:36)

提前感谢您的帮助

容器:

public class Container {

private Error error;
private String json;

public Error getError(){
return error;
}

public String getJson(){
return json;
}

public void setError(Error error){
this.error = error;
}

public void setJson(String json){
this.json = json;
}
}

共 (1) 个答案

  1. # 1 楼答案

    好的,分类了。。。我的好朋友J告诉我在EventContainer类中将事件列表的名称改为“events”,而不是“result”(我猜是匹配json对象“events”),瞧!!!!它有效!!!tbh我不知道它必须匹配名称,我认为这是更通用或更具描述性的东西,但永远不会限制它是否正确解析它。。。嗯,有时候你必须通过艰苦的方式学习。为其他人的兴趣和帮助的意愿干杯