Java 使用gson反序列化接口数据不返回值?
我在下面做一个简单的实验测试Java 使用gson反序列化接口数据不返回值?,java,gson,Java,Gson,我在下面做一个简单的实验测试 public class MyTest { @Test public void testing() { GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(SubData.class, new SubDataImplInstanceCreator()); Gson gson = builder.create();
public class MyTest {
@Test
public void testing() {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(SubData.class, new SubDataImplInstanceCreator());
Gson gson = builder.create();
Dataclass data = new Dataclass();
data.key1 = "abc";
SubDataImpl subData = new SubDataImpl();
subData.hello = "ttt";
data.sub = subData;
String jsonValue = gson.toJson(data);
System.out.println(jsonValue);
Dataclass data2 = gson.fromJson(jsonValue, Dataclass.class);
System.out.println(gson.toJson(data2));
}
class Dataclass implements Serializable {
String key1;
SubData sub;
}
interface SubData {
String getHello();
}
class SubDataImpl implements SubData, Serializable {
String hello;
@Override
public String getHello() {
return hello;
}
}
public class SubDataImplInstanceCreator implements InstanceCreator<SubDataImpl> {
@Override
public SubDataImpl createInstance(Type type) {
return new SubDataImpl();
}
}
}
因为它们本质上是被序列化和反序列化的相同数据
然而,当我运行它时,我得到了
{"key1":"abc","sub":{"hello":"ttt"}}
{"key1":"abc","sub":{}}
为什么在反序列化Json字符串之后,我会丢失我的
子数据
值?我的代码中遗漏了什么吗?您似乎已经找到了这个问题,建议的解决方案是在接口中使用TypeAdapter
快速而肮脏的实现(使用它代替SubDataImplInstanceTypeAdapter)
public类subdataimpleInstanceTypeAdapter实现JsonDeserializer、JsonSerializer{
@凌驾
public SubDataImpl反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
SubDataImpl impl=新的SubDataImpl();
JsonObject object=json.getAsJsonObject();
impl.setHello(object.get(“hello”).getAsString();
返回impl;
}
@凌驾
公共JsonElement序列化(SubDataImpl src,类型typeOfSrc,JsonSerializationContext){
返回context.serialize(src);
}
}
我正在使用下面的
public class MyTest {
@Test
public void testing() {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(SubData.class, new SubDataTypeAdapter());
Gson gson = builder.create();
Dataclass data = new Dataclass();
data.key1 = "abc";
SubDataImpl subData = new SubDataImpl();
subData.hello = "ttt";
data.sub = subData;
String jsonValue = gson.toJson(data);
System.out.println(jsonValue);
Dataclass data2 = gson.fromJson(jsonValue, Dataclass.class);
System.out.println(gson.toJson(data2));
}
class SubDataTypeAdapter extends TypeAdapter<SubDataImpl> {
@Override
public void write(JsonWriter out, final SubDataImpl subData) throws IOException {
out.beginObject();
out.name("hello").value(subData.getHello());
out.endObject();
}
@Override
public SubDataImpl read(JsonReader in) throws IOException {
final SubDataImpl subData = new SubDataImpl();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "hello":
subData.hello = in.nextString();
break;
}
}
in.endObject();
return subData;
}
}
class Dataclass implements Serializable {
String key1;
SubData sub;
}
abstract class SubData {
abstract String getHello();
}
class SubDataImpl extends SubData implements Serializable {
String hello;
@Override
public String getHello() {
return hello;
}
}
}
公共类MyTest{
@试验
公开无效测试(){
GsonBuilder=新的GsonBuilder();
registerTypeAdapter(SubData.class,新的SubDataTypeAdapter());
Gson Gson=builder.create();
Dataclass数据=新的Dataclass();
data.key1=“abc”;
SubDataImpl subData=新的SubDataImpl();
subData.hello=“ttt”;
data.sub=子数据;
字符串jsonValue=gson.toJson(数据);
System.out.println(jsonValue);
Dataclass data2=gson.fromJson(jsonValue,Dataclass.class);
System.out.println(gson.toJson(data2));
}
类SubDataTypeAdapter扩展了TypeAdapter{
@凌驾
public void write(JsonWriter out,final SubDataImpl subData)抛出IOException{
out.beginObject();
out.name(“hello”).value(subData.getHello());
out.endObject();
}
@凌驾
public SubDataImpl read(JsonReader in)引发IOException{
final SubDataImpl subData=new SubDataImpl();
in.beginObject();
while(在.hasNext()中){
开关(在.nextName()中){
案例“你好”:
subData.hello=in.nextString();
打破
}
}
in.endObject();
返回子数据;
}
}
类Dataclass实现可序列化{
字符串键1;
子数据子;
}
抽象类子数据{
抽象字符串getHello();
}
类SubDataImpl扩展子数据实现可序列化{
串你好;
@凌驾
公共字符串getHello(){
回复你好;
}
}
}
很酷。你的工作。我还使用下面的方法实现了它。
public class SubDataImplInstanceTypeAdapter implements JsonDeserializer<SubDataImpl>, JsonSerializer<SubDataImpl> {
@Override
public SubDataImpl deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
SubDataImpl impl = new SubDataImpl();
JsonObject object = json.getAsJsonObject();
impl.setHello(object.get("hello").getAsString());
return impl;
}
@Override
public JsonElement serialize(SubDataImpl src, Type typeOfSrc, JsonSerializationContext context) {
return context.serialize(src);
}
}
public class MyTest {
@Test
public void testing() {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(SubData.class, new SubDataTypeAdapter());
Gson gson = builder.create();
Dataclass data = new Dataclass();
data.key1 = "abc";
SubDataImpl subData = new SubDataImpl();
subData.hello = "ttt";
data.sub = subData;
String jsonValue = gson.toJson(data);
System.out.println(jsonValue);
Dataclass data2 = gson.fromJson(jsonValue, Dataclass.class);
System.out.println(gson.toJson(data2));
}
class SubDataTypeAdapter extends TypeAdapter<SubDataImpl> {
@Override
public void write(JsonWriter out, final SubDataImpl subData) throws IOException {
out.beginObject();
out.name("hello").value(subData.getHello());
out.endObject();
}
@Override
public SubDataImpl read(JsonReader in) throws IOException {
final SubDataImpl subData = new SubDataImpl();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "hello":
subData.hello = in.nextString();
break;
}
}
in.endObject();
return subData;
}
}
class Dataclass implements Serializable {
String key1;
SubData sub;
}
abstract class SubData {
abstract String getHello();
}
class SubDataImpl extends SubData implements Serializable {
String hello;
@Override
public String getHello() {
return hello;
}
}
}