我想使用Gson创建一个解析JSON的解析器。
第一个IParser.java。
第二个
第一个IParser.java。
public interface IParser<T> {
public T parse(String json);
}
第二个
Parser.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
public class Parser<T> implements IParser<T> {
@Override
public T parse(String json) {
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.enableComplexMapKeySerialization().create();
MyJson<T> jsonParsed = gson.fromJson(json, new TypeToken<MyJson<T>>() {
}.getType());
System.out.println(jsonParsed.toString());
return null;
}
}
第三个 MyJson.java
public class MyJson<T> {
private int status;
private T data;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
并且 User.java
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private long usrId;
private String usrNm;
private String usrPwd;
private String usrEml;
public User() {
}
public long getUsrId() {
return usrId;
}
public void setUsrId(long usrId) {
this.usrId = usrId;
}
public String getUsrNm() {
return usrNm;
}
public void setUsrNm(String usrNm) {
this.usrNm = usrNm;
}
public String getUsrPwd() {
return usrPwd;
}
public void setUsrPwd(String usrPwd) {
this.usrPwd = usrPwd;
}
public String getUsrEml() {
return usrEml;
}
public void setUsrEml(String usrEml) {
this.usrEml = usrEml;
}
@Override
public String toString() {
return "User [usrId=" + usrId + ", usrNm=" + usrNm + ", usrPwd="
+ usrPwd + ", usrEml=" + usrEml + "]";
}
}
我的JSON字符串:
{
status: 200,
data: {
usrId: 2,
usrNm: "John",
usrPwd: "123",
usrEml: "john@test.com"
}
}
我想将上述json字符串解析为MyJson<T>
对象。
我这样做:
MyJson<T> jsonParsed = gson.fromJson(json, new TypeToken<MyJson<T>>() {
}.getType());
=> Gson
将MyJson
中的User
解析为LinkedTreeMap
意思是:Object data = jsonParsed.getData();
=> data实例是LinkedTreeMap
我的期望是:data实例是User
但是,当我尝试时:
MyJson<User> jsonParsed = gson.fromJson(json, new TypeToken<MyJson<User>>() {
}.getType());
gson工作正常。
因此,我想知道如何让gson与第一种方式(使用T而不是User)配合使用,因为我想通过解析器来解析其他对象。
谢谢您的帮助。
TypeToken
hack 仅在显式传递类型时才起作用。在运行时,T
的类型完全被擦除。 - Brian Roach