使用TypeAdapter的GSON自定义反序列化

p1tboqfb  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(232)

代码将工作并反序列化JSON字符串

  1. {"d": [{"d1": "D1"}, {"d2": "D2"}]}

Dto类型的dto对象。但是,DtoAdapter类对我来说似乎有点复杂。有没有更好的DtoAdapter实现?有没有更好的方法使用GSON自定义反序列化JSON字符串以获得相同的结果?
第一个

x0fgdtte

x0fgdtte1#

你可以这样写自定义反序列化器:

  1. import com.google.gson.JsonArray;
  2. import com.google.gson.JsonDeserializationContext;
  3. import com.google.gson.JsonDeserializer;
  4. import com.google.gson.JsonElement;
  5. import com.google.gson.JsonObject;
  6. import com.google.gson.JsonParseException;
  7. import java.lang.reflect.Type;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.Objects;
  11. public class CustomDeserilizer implements JsonDeserializer<Dto> {
  12. @Override
  13. public Dto deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
  14. JsonObject jobject = jsonElement.getAsJsonObject();
  15. JsonArray jsonArray = jobject.getAsJsonArray("d");
  16. Dto dto = new Dto();
  17. List<Dto.Item> items = new ArrayList<>();
  18. for (int i = 0; i < jsonArray.size(); i++) {
  19. Dto.Item item = new Dto.Item();
  20. JsonObject object = jsonArray.get(i).getAsJsonObject();
  21. if(Objects.nonNull(object.get("d1"))){
  22. item.setName(object.get("d1").getAsString()+ " custom case 1");
  23. }
  24. if(Objects.nonNull(object.get("d2"))){
  25. item.setName(object.get("d2").getAsString()+ " custom case 2");
  26. }
  27. items.add(item);
  28. }
  29. dto.setItems(items);
  30. return dto;
  31. }
  32. }

如果你用下面的代码测试它:

  1. GsonBuilder gsonBuilder = new GsonBuilder();
  2. String json = "{\"d\": [{\"d1\": \"D1\"}, {\"d2\": \"D2\"}]}";
  3. gsonBuilder.registerTypeAdapter(Dto.class, new CustomDeserilizer());
  4. Gson customGson = gsonBuilder.create();
  5. Dto customObject = customGson.fromJson(json, Dto.class);
  6. System.out.println(customObject);

您应该会看到如下所示的输出:

  1. Dto{items=[Item{name='D1 custom case 1'}, Item{name='D2 custom case 2'}]}
展开查看全部
8ftvxx2r

8ftvxx2r2#

您似乎可以为列表项创建一个具有备用名称的DTO属性。

  1. public class D {
  2. @SerializedName(value = "d1", alternate = "d2")
  3. @Expose
  4. private String d1;
  5. public String getD1() {
  6. return d1;
  7. }
  8. public void setD1(String d1) {
  9. this.d1 = d1;
  10. }
  11. }

相关问题