4
votes

Impossible de mapper la chaîne à l'objet

J'ai une valeur JSON comme suit au format String.

@Getter
@Setter
public class Data {
    private Sample sample;
    private Offering offering;
}

@Getter
@Setter
public class Offering {
    public String offer;
    public int amount;
}

@Getter
@Setter
public class Sample {
    private String name;
    private String key;
}

Maintenant, si j'essaie de mapper ceci comme suit, cela fonctionne et mappe bien.

Data vo = mapper.readValue(data, Data.class);

Mais je veux le mapper à une classe de données personnalisée comme suit.

//mapper is ObjectMapper;
//data is the above json in String format
Map vo = mapper.readValue(data, Map.class);

Quand je fais cela, le résultat de vo est nul.

Reportez-vous à ce qui suit pour savoir comment la classe Data est structurée.

{
    "Sample": {
        "name": "some name",
        "key": "some key"
    },
    "Offering": {
        "offer": "some offer",
        "amount": 100
    }
}

Veuillez indiquer ce que je fais mal. Merci.


4 commentaires

Jackson comprend-il réellement ces annotations @Setter et @Getter ? Chaque fois que j'ai fait cela, je viens de créer les méthodes appropriées.


Je doute vraiment que vo soit nul. Son échantillon et son offre sont probablement nuls, cependant, puisque Jackson s'attendrait à deux propriétés nommées sample et offer , et le JSON contient Sample et Offre


Je vois en json son "Sample", mais en classe son "sample"


@markspace - c'est Lombok. C'est un moyen de générer des getters et des setters sans avoir à écrire les getters et setters.


3 Réponses :


5
votes

Il semble y avoir un problème avec Word Case ici. Son "Sample" dans votre json. Mais son "échantillon" dans un fichier java. De même pour l'offre.

Vous pouvez bien sûr utiliser @JsonProperty si vous souhaitez mapper sans changer la casse.


0 commentaires

3
votes

Il existe deux options:

  1. si vous pouvez changer votre json - vous devez changer Sample en sample et Offer à offrir

  2. Remplacez votre classe Data par:

@Getter
@Setter
public class Data {
    @JsonProperty("Sample")
    private Sample sample;

    @JsonProperty("Offering")
    private Offering offering;
}

Dans la deuxième option, vous devez indiquer à Jackson quelles propriétés de votre entrée json vous voulez mapper à laquelle propriétés de votre classe, car par défaut, il essaiera de faire correspondre les noms de propriétés en minuscules.


0 commentaires

3
votes

Cela peut être dû à des noms de mappage différents des champs dans la chaîne json et le modèle de démonstration. "Sample" dans la chaîne json mais "sample" dans la classe model.

Vous pouvez utiliser @JsonProperty

@JsonProperty("Sample")
private Sample sample;
@JsonProperty("Offering")
private Offering offering;


0 commentaires