Джексон сериализует пользовательский объект TreeNode для возврата JSONObject - PullRequest
0 голосов
/ 09 января 2019

У меня есть такой объект:

public class TreeNodeLabel {

    TreeNodeLabel parent;
    List<TreeNodeLabel> children;
    Map<String, String> prop;
    String name;
}

Я хочу получить JSONObject вот так

"data": {
    "auth": {
      "myChallenges": "Visualiser vos défis",
      "myMessages": "Accéder à la messagerie",
      "myProfile": "Accéder à votre profil",
      "myGroup": "Accéder à vos groupes",
      "launchChallenge": "Lancer un défi",
      "login": {
        "login": "Me connecter",
        "label": "Connectez-vous",
        "loginLabel": "E-mail",
        "passwordLabel": "Mot de passe",
        "action": "Je me connecte",
        "sign": "M'inscrire",
        "facebook": "Facebook",
        "google": "Google",
        "lost": "Mot de passe oublié ?",
        "lostParam": "Hey {name}, déjà {passwordCount, number} {passwordCount, plural, one {mot de passe oublié} other {mots de passe oubliés}} ce mois ci !",
        "useSocialNetwork": "Utilisez vos réseaux sociaux pour vous connecter",
        "noAccount": "Je n'ai pas de compte",
        "errors": {
          "loginRequired": "Email requis",
          "loginFormat": "Format de l'email incorrect",
          "passwordRequired": "Mot de passe obligatoire",
          "passwordFormat": "Format invalide"
        }
      },
      "socialNetworkErrors": {
        "missingPermissions": "Vous devez partager votre email pour vous connecter avec votre compte Facebook.",
        "inProgress": "Une connexion via Google est déjà en cours.",
        "playServicesNotAvailable": "Les services Google Play ne sont pas installés ou pas à jour."
      }
    },
    "message": {
      "chatView": {
        "loadPreviousMessages": "Charger les messages précédents",
        "send": "Envoyer",
        "placeholder": "Ecrivez un message..."
      },
      "conversation": {
        "duration": "Il y a"
      }
    }
}

Я пробовал с некоторыми другими аннотациями, такими как (@ JsonManagedReference, @ JsonIgnore, @ JsonProperty) но получите JSON, который содержит объекты с именами "children", "prop" вместо свойства "name" для каждого потомка и список prop под этим

1 Ответ

0 голосов
/ 09 января 2019

Вы можете добавить метод, помеченный @JsonValue, в ваш класс TreeNodeLabel, который создает желаемую структуру.

например.

    @JsonValue
    public Map<String, Map<String, Object>> jsonValue() {
        Map<String, Map<String, Object>> values = new HashMap<>();
        Map<String, Object> propValues = new HashMap<>();
        propValues.putAll(prop);
        // add each of the children.
        for (TreeNodeLabel child : children) {
            propValues.putAll(child.jsonValue());
        }
        values.put(name, propValues);
        return values;
    }

Если вы тоже хотите десериализовать, вам нужно добавить @ JsonCreator.

...