问题描述
在服务器端,我使用以下命令将对象格式化为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。”
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)