为什么这个Gson解析无法完成?

时间:2020-08-19 19:34:05

标签: java json libgdx gson

在服务器端,我使用以下命令将对象格式化为Json:

    String typeJson = new Gson().toJson(typeContainer);

在客户端,我使用以下方法解包

    JSONContainer<CommonNoun> typeContainer = new Gson().fromJson(result,
                             new TypeToken<JSONContainer<CommonNoun>>(){}.getType());

在执行过程中,线程永远不会越过上面的行(我紧随其后有一个println)。

我检查了客户端接收到的“结果”字符串是否与服务器上生成的“ typeJson”相同。看起来像这样:

{"myObject":{"cid":{"oid":129},"name":"technology","form":1},"children":[]}  

组成要发送的对象的4个类是:

public class JSONContainer<T> {

    private T myObject;
    private ArrayList<JSONContainer<T>> children;
    
    public JSONContainer() {

    }
    
    public JSONContainer(T anObject) {
        myObject = anObject;
        children = new ArrayList<JSONContainer<T>>();
    }
    
    public void addChildren(ArrayList<JSONContainer<T>> newChildren) {
        children.addAll(newChildren);
    }

    public void addChild(T concept) {
        children.add(new JSONContainer<T>(concept));
    }
        
    public ArrayList<JSONContainer<T>> getChildren() {
        return children;
    }
    
    public T getValue() {
        return myObject;
    }
    
    public boolean hasChildren() {
        if (children.size() > 0) return true;
        else return false;
    }
    
    public String toString() {
        return myObject.toString();
    }
}


public class CommonNoun extends Concept {
        
    /**
     * 
     */
    private static final long serialVersionUID = 6444629581712454049L;

    public CommonNoun() {
        super();
    }
    
    public CommonNoun(String name, ConceptID cidIn) {
        super(name, cidIn);
        this.form = ConceptDefs.COMMON_NOUN;
    }
    
}

public class Concept implements Serializable {
    
    /**
     * 
     */
    private static final long serialVersionUID = 2561549161503772431L;
    private ConceptID cid = null;
    private final String name;
    Integer form = 0;
    
//    ArrayList<ProperRelationship> myRelationships = null;

    
/*  @Deprecated
    public Concept(String name) {
        this.name = name;
    }*/
    
    public Concept() {
        name = "";
    }

    public Concept(String name, ConceptID cidIn) {
       // this(name);
        this.name = name;
        cid = cidIn;
    }

    /*
     * This should be over-ridden by any subclasses
     */
    public Integer getForm() {
        return form;
    } 
            
    public ConceptID getID() {
        return cid;
    }
    
    public void setID(ConceptID cidIn) {
        cid = cidIn;
    }
    
    //this doesn't make any sense.  Throw exception?
    public String getName() {
        return name;
    }

    public boolean isCommon() {
        return true;
    }
    
    /**
     *
     * @return
     */
    @Override
    public String toString() {
        return getName() + "(" + cid.toString() + ")";
    }
    
    public boolean equals(Concept other) {
        return ((getID().equals(other.getID())));
    }
       
}

public class ConceptID implements Serializable {

    long oid;
    
    public ConceptID() {
        oid = -1;
    }
    public ConceptID(long oid) {
        this.oid = oid;
    }
    
    public long getValue() {
        return oid;
    }
    
    /**
     *
     * @return
     */
    @Override
    public String toString() {
        return Long.toString(oid);
    }
    
    public Long toLong() {
        return Long.valueOf(oid);
    }

    
    public boolean equals(ConceptID other) {
        return (oid == other.getValue());
    }
    
    /**
     * Factory model for generating ConceptIDs
     * 
     * This one is here as a convenience as many IDs come in as a String from web POSTs
     * @param idAsString
     * @return
     */
    static public ConceptID parseIntoID(String idAsString) {
        ConceptID returnID = null;
        try {
            returnID = new ConceptID( Long.parseLong(idAsString) );
        } catch (Exception e) {
            System.err.println("Expected the string, " + idAsString + ", to be Long parsable.");
            e.printStackTrace();
        }
        return returnID;

    }
}

在尽力解决这一问题时,我努力使变量最小化。现在,我在两侧使用相同的json解析器,并且以一种引用泛型时不会产生类型警告的方式编写fromJson()语句。我已经研究了Gson的api(仍然还有GsonBuilder()的组合需要用尽),并且我已经用诸如“ Gson”,“ Json”,“ parsing”,“ lock”,“ not complete”之类的术语搜索了StackOverflow和Google。 ”在介绍新的泛型类之前,使用Gson格式化和反编译json经历了成功。

更新:

@ParanoidAndroid共享了在他的环境中可以进行解析的功能后,我尝试解析json服务器端,在此起作用。那么我的服务器和客户端有什么不同?通过选择Eclipse中的项目向导选项之一来生成服务器项目,而客户端是libGDX项目。这里的另一个潜在线索是libGDX为json操作实现了自己的类,称为Json-这样做是为了解决这种情况?

为什么我不使用本地Json类?我以这种方式开始,但是无法获得匹配的格式。尽管尝试了setOutputType(OutputType)中的所有可用选项,但Json显然不是标准的。

How do I read this Generics correctly from JSON?

接下来,我尝试在服务器端使用Json,但无法使配置正常工作:出现ClassDefNotFound错误。

我控制的另一个变量是复制并替换所有通过Json从服务器传递到客户端项目的类,以确保每个人都使用相同的版本(我敢肯定有某种方法可以获取项目互相引用对方的课程,但我还不知道。)

(最终?)更新:

试图根据请求创建线程转储,但是Java Mission Control没有任何一个。

找到的文档说,如果我想在libGDX之外使用本机Json类,则应该使用jsonbeans:https://github.com/EsotericSoftware/jsonbeans/

将我的json序列化服务器端替换为jsonbeans,现在可以使用本地Json类客户端了。

对于“为什么Gson解析不完整?”这个问题,答案很差:

“因为在某些情况下,只有本地Json解析器在libGDX中起作用。此外,如果希望该类与非libGDX项目一起使用,则最好使用它的伴随类jsonbeans。”

0 个答案:

没有答案
相关问题