如何使用Gson将外观相似的JSON结构转换为不同的POJO?

x6492ojm  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(179)

我有以下2个JSON,一个用于登录,另一个用于订购

{
          "head": {
            "requestCode": "code"
          },
          "body": {
            "reqId": "xyz",
            "userName": "xyz",
            "passwd": "xyz",
          }
        }

        {
          "head": {
            "requestCode": "code"
          },
          "body": {
            "reqId": "xyz",
            "orderId": "xyz"
          }
        }

我正在尝试编写java pojo,其中body的head和refId对于每个json是通用的,但body的其他内容是通用的。
就像下面的pojo。现在的问题是GSon不能解析和构建基于嵌套参数化类型的对象。有没有更好的方法来实现它?不是JSON结构不会改变。
波约

public class Base<T extends Body> {

@SerializedName("head")
@Expose
public Head head;
@SerializedName("body")
@Expose
private T body;
}

public class Body {
@SerializedName("clientCode")
@Expose
private String clientCode;
}

public class Head {
@SerializedName("requestCode")
@Expose
public String requestCode;
}

public class Login extends Body {
@SerializedName("userName")
@Expose
public String userName;
@SerializedName("passwd")
@Expose
public String passed;
}

public class Order extends Body {
@SerializedName("orderId")
@Expose
String orderId;
}
inb24sb2

inb24sb21#

您可以引入两个用于反序列化的Base的新子类,例如:

  • class LoginRequest extends Base<Login> { }
  • class OrderRequest extends Base<Order> { }

或者,您可以使用Gson的TypeToken class来还原序列化参数化的Base型别。请参阅使用者指南中的Map章节。例如:

Type loginType = new TypeToken<Base<Login>>() {}.getType();
Base<Login> loginRequest = gson.fromJson(..., loginType);

相关问题