gson JSON:使用反序列化名称与序列化名称json不同

m1m5dgzv  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(343)

我有一个类**User**,我从system1接收到JSON(用于用户类),我应该读取信息,验证,然后转发到system2,我无法访问这两个系统,问题是键的名称不同,我想区分反序列化和序列化名称,接收到的JSON是:

一个月一个月
"{"username":"user1","password":"123456","country":"US"}"

但斯派应该是这样的
我使用的是Gson lib,这是我的代码:

用户类别:

  1. class User implements Cloneable {
  2. @SerializedName("username")
  3. private String username ;
  4. @SerializedName("password")
  5. private String password ;
  6. @SerializedName("country")
  7. private String country ;
  8. }

TestJson类别

  1. class TestJson {
  2. private static GsonBuilder gsonBuilder;
  3. private static Gson gson;
  4. public static Object fromJson(String json, Class clz) {
  5. gson = new Gson();
  6. return gson.fromJson(json, clz);
  7. }
  8. public static String toJson(Object obj) {
  9. gsonBuilder = new GsonBuilder();
  10. gson = gsonBuilder.create();
  11. String json = gson.toJson(obj);
  12. return json;
  13. }
  14. public static void main(String[] args) {
  15. String json2 = "{\"userId\":\"user1\",\"pwd\":\"123456\",\"country\":\"US\"}";
  16. User user = (User) TestJson.fromJson(json2, User.class);
  17. System.out.println(user.getPassword());
  18. User u = new User("user1","123456","US");
  19. String json1 = TestJson.toJson(u);
  20. System.out.println(json1);
  21. }
  22. }
ia2d9nvy

ia2d9nvy1#

如果有字段的替代名称,只需使用@SerializedNamealternate参数

  1. public class User {
  2. @SerializedName(value="username", alternate={"userId", "useriD"})
  3. private String username ;
  4. ...
  5. }
h6my8fg2

h6my8fg22#

您可以为此目的建立自订序列化程式/还原序列化程式。
串行器:

  1. public class UserSerializer implements JsonSerializer<User> {
  2. @Override public JsonElement serialize(User obj, Type type, JsonSerializationContext jsonSerializationContext) {
  3. ..........
  4. }
  5. }

解串器:

  1. public class UserDeserializer implements JsonDeserializer<User> {
  2. @Override public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
  3. ...........
  4. }
  5. }

并创建Gson示例:

  1. GsonBuilder gsonBuilder = new GsonBuilder();
  2. gsonBuilder.registerTypeAdapter(User.class, new UserSerializer());
  3. gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
  4. Gson gson = gsonBuilder.create();

示例

编辑:这是一个自定义的反序列化器的例子,它可能符合你的需要。在这种情况下,我们不需要自定义的序列化器。
添加此UserDeserializer.java

  1. public class UserDeserializer implements JsonDeserializer<User> {
  2. @Override
  3. public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
  4. JsonObject obj = json.getAsJsonObject();
  5. User user = new User(obj.get("userId").getAsString(), obj.get("pwd").getAsString(), obj.get("country").getAsString());
  6. return user;
  7. }
  8. }

将您的fromJson实现替换为以下代码(我使用泛型以避免在调用fromJson时需要强制转换):

  1. public static <T> T fromJson(String json, Class<T> clz) {
  2. gsonBuilder = new GsonBuilder();
  3. gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
  4. gson = gsonBuilder.create();
  5. return gson.fromJson(json, clz);
  6. }
展开查看全部
4nkexdtk

4nkexdtk3#

我能想到的唯一方法是为JsonObject定制一个适配器或deser,然后将其Map到您的User。
使用Genson,您可以创建两个Genson示例,一个用于反序列化,另一个用于序列化。反序列化中使用的示例可以配置为具有这样重命名的属性。

  1. // you can also precise that you want to rename only the properties from User class
  2. Genson genson = new GensonBuilder()
  3. .rename("username", "userId")
  4. .rename("password", "pwd")
  5. .create();
  6. User user = genson.deserialize(json, User.class);

相关问题