Guest User

Untitled

a guest
Apr 23rd, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.79 KB | None | 0 0
  1. class A {
  2. List<BaseClass> items;
  3. }
  4.  
  5. A obj;
  6. ........
  7. gson.toJson(obj);
  8.  
  9. class A {
  10. List<BaseClass> items;
  11. }
  12.  
  13. class BaseClass {
  14. String field;
  15. }
  16.  
  17. public class CustomSerializer implements JsonSerializer<A> {
  18. @Override
  19. public JsonElement serialize(A src, Type type, JsonSerializationContext context) {
  20. JsonArray items = new JsonArray();
  21.  
  22. for (BaseClass item : src.items) {
  23. if (item.getClass().getSimpleName().equals("BaseClass")) {
  24. JsonObject currentItem = new JsonObject();
  25. currentItem.addProperty("field", item.field);
  26. items.add(currentItem);
  27. }
  28. }
  29. return items;
  30. }
  31. }
  32.  
  33. GsonBuilder builder = new GsonBuilder();
  34. builder.registerTypeAdapter(A.class, new CustomSerializer());
  35. Gson gson = builder.create();
  36.  
  37. A obj;
  38. ........
  39. gson.toJson(obj);
  40.  
  41. class A {
  42. List<BaseClass> items;
  43.  
  44. A(ArrayList<BaseClass> items) {
  45. this.items = items;
  46. }
  47. }
  48.  
  49. class BaseClass {
  50. String field;
  51.  
  52. BaseClass(String field) {
  53. this.field = field;
  54. }
  55. }
  56.  
  57. public class CustomDeserializer implements JsonDeserializer<A> {
  58.  
  59. @Override
  60. public A deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
  61. JsonArray items = (JsonArray) json;
  62.  
  63. A a = new A(new ArrayList<>());
  64.  
  65. for (JsonElement item : items) {
  66. JsonObject currentItem = new JsonObject();
  67. BaseClass baseClass = new BaseClass(item.getAsString());
  68. a.items.add(baseClass);
  69. }
  70. return a;
  71. }
  72. }
  73.  
  74. GsonBuilder builder = new GsonBuilder();
  75. builder.registerTypeAdapter(A.class, new CustomDeserializer());
  76. Gson gson = builder.create();
  77.  
  78. public class CustomSerializer implements JsonSerializer<A> {
  79. @Override
  80. public JsonElement serialize(A src, Type type, JsonSerializationContext context) {
  81. // Сериализуем поля родителя без изменений
  82. JsonObject res = (JsonObject)context.serialize(src, src.getClass().getSuperclass());
  83. // Получаем свои поля
  84. Field[] flds = src.getClass().getDeclaredFields();
  85. for (Field fld : flds) {
  86. Type fldType = fld.getGenericType();
  87. JsonElement jField;
  88. Object fieldVal;
  89. try {
  90. // Получаем значение поля
  91. fieldVal = fld.get(src);
  92. } catch (IllegalAccessException e) {
  93. throw new RuntimeException(e);
  94. }
  95. // Если тип поля List и его наследники и это generic-тип
  96. if (fld.getType().isAssignableFrom(List.class) && fldType instanceof ParameterizedType) {
  97. // Получаем конкретные типы, которые были указаны в объявлении List<>
  98. ParameterizedType paramType = (ParameterizedType)fldType;
  99. Type[] args = paramType.getActualTypeArguments();
  100. // формируем массив
  101. JsonArray jsonArray = new JsonArray();
  102. for (Object item : (List)fieldVal) {
  103. // сериализуем элемент списка, как тип, который был указан при объявлении
  104. JsonObject currentItem = (JsonObject)context.serialize(item, args[0]);
  105. jsonArray.add(currentItem);
  106. }
  107. jField = jsonArray;
  108. }
  109. else {
  110. // Если у нас не список, то вызываем умолчательный сериализатор
  111. jField = context.serialize(fieldVal);
  112. }
  113. res.add(fld.getName(), jField);
  114. }
  115. return res;
  116. }
  117. }
Add Comment
Please, Sign In to add comment