Джексон сериализует пользовательский объект TreeNode для возврата JSONObject
У меня есть такой объект:
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 ответ
Вы можете добавить метод, помеченный @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.