0
votes

Comment obtenir un objet Json référencé par le nom Pojo lorsque nous avons la liaison de données Jackson

Je génère des services de repos à l'aide de Jackson. Je peux obtenir une réponse JSON comme

public class UserDetails implements Serializable{

private String userName;
private int userId;

public UserDetails(){

}

 //getters and setters...
}

mais j'attends une réponse avec le nom Pojo pointant vers la réponse comme ci-dessous

@Service("userServices")
public class UserServiceImpl implements UserServices{

private UserServices userServices;

public UserServices getUserServices() {
    return userServices;
}
public void setUserServices(UserServices userServices) {
    this.userServices = userServices;
}

@Override
public List<UserDetails> getUser(UserDetails userDetails) {


    ObjectMapper mapper = new ObjectMapper();

    List<UserDetails> user = new ArrayList<UserDetails>();
    List<UserDetails> list = new ArrayList<UserDetails>();

    UserDetails userDetails2 = new UserDetails();
    userDetails2.setUserName("scott");
    userDetails2.setUserId(007);

    UserDetails userDetails3 = new UserDetails();
    userDetails3.setUserName("toe");
    userDetails3.setUserId(101);

    user.add(userDetails2);
    user.add(userDetails3);

    try{
    String jsonString = mapper.writeValueAsString(user);
    UserDetails[] userDetails4 = mapper.readValue(jsonString, UserDetails[].class);
    list = Arrays.asList(userDetails4);
    System.out.println(userDetails4);
    }catch (Exception e) {
        System.out.println(e);
    }
    return list;
}
}

Voici ma classe d'implémentation

{"UserDetails":[{"userName":"scott","userId":7},{"userName":"toe","userId":101}]}

et voici mon pojo

[{"userName":"scott","userId":7},{"userName":"toe","userId":101}]

** Remarque: ** Je ne veux pas utilisez les annotations du côté de l'objet du domaine.


1 commentaires

Pourquoi voulez-vous avoir ça? Quel avantage le champ supplémentaire vous apporte-t-il? Je pense que c'est inutile.


3 Réponses :


0
votes

Vous renvoyez une liste de UserDetails qui se traduit par votre objet de réponse comme étant un tableau JSON. Pour obtenir le résultat souhaité, vous devez créer une classe Container (UserDetailsContainer) qui a la propriété userDetails de type List et renvoyer une instance de celle-ci comme réponse.


0 commentaires

1
votes

Renvoyez simplement

UserDetailsResponse:

public class UserDetailsResponse {

    private List<UserDetails> userDetails;
    // getter and setter

}

au lieu de la liste de UserDetails dans UserServiceImpl (et probablement dans le contrôleur).


2 commentaires

Cela fonctionne bien, mais je pense que cela ne s'applique pas à plusieurs méthodes d'appel de service. toute suggestion pour cela


Je ne sais pas si je comprends correctement votre problème, mais vous pouvez conserver le service pour renvoyer List (comme vous l'aviez fait), puis effectuer le mappage vers l'objet de réponse uniquement lorsqu'il quitte votre application (par exemple dans le contrôleur)



0
votes

Vous pouvez utiliser objectMapper.writeValueAsString (aCustomMap) pour la création de vues Json personnalisées à la volée.

Exemple:

UserDetails userDetails2 = new UserDetails();
userDetails2.setUserName("scott");
userDetails2.setUserId(007);

UserDetails userDetails3 = new UserDetails();
userDetails3.setUserName("toe");
userDetails3.setUserId(101);

Map<String, List<UserDetails>> m = new HashMap<>();
m.put("UserDetails", Arrays.asList(userDetails2, userDetails3));

System.out.print(
    //This is what you need
    objectMapper.writeValueAsString(m)
);
//{"UserDetails":[{"userName":"scott","userId":7},{"userName":"toe","userId":101}]}


8 commentaires

merci pour la réponse, lorsque j'utilise cela, j'obtiens une exception de compilation telle que l'incompatibilité de type: impossible de convertir de Map > en List


Désolé, remplacez la voiture par le nom de votre classe UserDetails. Tester un code de modèle avec une classe Car.


ouais j'ai déjà changé ça même si ça donne la même erreur


Quel est votre code mis à jour? Mon code est en train d'être compilé et fonctionne. C'était juste une démonstration d'utiliser une carte pour le résultat souhaité. Vous devez l'utiliser selon les exigences de votre code. On dirait que vous passez cette carte là où une liste est requise. Veuillez utiliser la carte pour générer la chaîne JSON / JSON finale et ne pas créer de chaîne inutilement partout.


Map > m = new HashMap <> (); m.put ("UserDetails", Arrays.asList (userDetails2, userDetails3)); try {System.out.print (// C'est ce dont vous avez besoin mapper.writeValueAsString (m)); } catch (JsonProcessingException e) {e.printStackTrace (); } ici je veux retourner la liste des objets de détails de l'utilisateur


Modifiez la signature de méthode de List à Map >. Sinon, il renverra une liste et dans le json final, vous ne pouvez pas obtenir la balise de nom "UserDetails".


Merci pour la solution, cela fonctionne bien, y a-t-il une autre approche sans aucune modification du type de retour de méthode


Vous créez la carte dans la méthode du contrôleur et non dans la méthode de service. La méthode de service doit renvoyer la liste, la méthode du contrôleur doit prendre la décision de la montrer à l'utilisateur dans l'API.