使用Gson如何转换包含由许多类实现的接口的对象的Json对象 - Java

时间:2014-09-06 21:53:11

标签: java json gson

我想使用UserMsg

发送JSON的对象
public class UserMsg {
private String Type; 
private UserData userData; 

//Getters & Setters }

UserData是一个接口

有很多类实现UserData ..每次我发送Json对象时它的userData都可以是这些类中的任何一个对象。

所以在接收方我使用了这段代码:

        Gson gson = new Gson(); 
        UserMsg usermsg = gson.fromJson(JsonObject,UserMsg.class);

并收到此错误:

  

无法为接口UserData调用no-args构造函数。寄存器   这种类型的Gson InstanceCreator可以解决这个问题。

我尝试为InstanceCreator注册UserData,但它不起作用,所以我需要正确的方法让它运行。

1 个答案:

答案 0 :(得分:0)

您可能想要创建自定义适配器,在读/写方法中,您可以设置解析方法,以便处理实现UserData接口的不同类。像这样:

public class UserMsgAdapter extends TypeAdapter {

  @Override
  public UserMsg read(final JsonReader in) throws IOException {
    final UserMsg data = new UserMsg();

    in.beginObject();
    while (in.hasNext()) {

      in.nextName();
      if(in.nextString().equals(someType))
         // create one instance of a particular implementation

      }
    }
    in.endObject();

    return data;
  }

  @Override
  public void write(final JsonWriter out, final UserMsg msg) throws IOException {
    out.beginObject();
    // write according to the instance type
    out.endObject();
  }
}

并且不要忘记注册这个自定义适配器:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(UserMsg.class, new UserMsgAdapter());
final Gson gson = gsonBuilder.create();