Как получить данные неизвестного / гибкого или динамического c ключа через GSON? - PullRequest
0 голосов
/ 12 июля 2020

У нас есть JSON данные, как показано ниже, а имена ключей или полей динамического c (language.typeOfLesson.completed_at) различны для каждого пользователя.

Как мы можем получить данные неизвестного / гибкого или Dynami c имена полей (language.typeOfLesson.completed_at) через GSON?

Если мы не можем получить данные с неизвестными именами полей через GSON, есть ли способы получить / распечатать все имена полей и все данные через GSON?

    [
       {
          "email":"email1@gmail.com",
          "confirmed_at":"2017-12-03T18:34:32.000Z",
          "activated":true
       },
       {
          "email":"email3@gmail.com",
          "confirmed_at":"2017-10-03T18:34:32.000Z",
          "activated":true,
          "python.sql_injection.completed_at":"2018-01-24T22:05:25.000Z"
       },      
       {  
          "email":"email2@gmail.com",
          "confirmed_at":"2017-11-03T18:34:32.000Z",
          "activated":true,
          "java.privileged_interface_exposure.completed_at":"2018-01-19T19:45:44.000Z",
          "java.horizontal_privilege_escalation.completed_at":"2018-01-19T19:49:19.000Z"
       },
       {
          "email":"email5@gmail.com",
          "confirmed_at":"2017-08-03T18:34:32.000Z",
          "activated":true,
          "python.sql_injection.completed_at":"2018-01-24T22:05:25.000Z",
          "java.horizontal_privilege_escalation.completed_at":"2018-01-19T19:49:19.000Z",
          "android.sql_injection.completed_at":"2018-01-24T22:05:25.000Z"
       }
    ]
User.java
class User {
   String email;
   String confirmed_at;
   boolean activated;

   // Example: 
   // <java.sql_injection, 2018-01-24T22:05:25.000Z>
   // <java.horizontal_privilege_escalation, 2018-01-19T19:49:19.000Z>
   Map<String, String> completedLessons; // How to get date of courses/lessons completed by user?
}

Спасибо,

1 Ответ

0 голосов
/ 26 августа 2020

Это можно решить, создав собственный TypeAdapter , например:

public class UserTypeAdapter extends TypeAdapter<User> {
    // Call nullSafe() to make it handle null Users on its own
    public static final TypeAdapter<User> INSTANCE = new UserTypeAdapter().nullSafe();
    
    private UserTypeAdapter() { }
    
    @Override
    public void write(JsonWriter out, User value) throws IOException {
        // You will have to implement this in case you are
        // also writing JSON data
        throw new UnsupportedOperationException();
    }
    
    @Override
    public User read(JsonReader in) throws IOException {
        User user = new User();
        Map<String, String> completedLessons = new HashMap<>();
        
        in.beginObject();
        while (in.hasNext()) {
            String name = in.nextName();
            switch (name) {
                case "email":
                    user.email = in.nextString();
                    break;
                case "confirmed_at":
                    user.confirmed_at = in.nextString();
                    break;
                case "activated":
                    user.activated = in.nextBoolean();
                    break;
                // Treat every other name as lesson
                default:
                    completedLessons.put(name, in.nextString());
                    break;
            }
        }
        in.endObject();
        
        user.completedLessons = completedLessons;
        return user;
    }
}

Затем вы используете GsonBuilder, на котором вы регистрируете этот адаптер и создаете экземпляр Gson:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(User.class, UserTypeAdapter.INSTANCE)
    .create();

Примечание. Вы также можете анализировать даты (вместо того, чтобы оставлять их как String). Для этого вы можете использовать пользовательский TypeAdapterFactory , который создает TypeAdapter, показанный выше, но позволяет ему делегировать полномочия адаптеру даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...