CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[java] Ecrire dans un Json avec Jackson

cybevil
cybevil
Niveau 27
30 avril 2021 à 17:33:31

Bonjour, je réalise actuellement un projet pour l'un de mes cours et j'essaye d'écrire un objet à la fin de mon fichier json (plus précisément dans l'attribut cards) sans tout réécrire en utilisant la library Jackson.

Le souci c'est que lorsque j'essaye de faire ceci, mon objet est bien écrit sans tout remplacer, mais il est écris à la toute fin du fichier hors j'essaye de le placer dans la liste de cards entre les crochets.

Est-ce que quelqu'un aurait une idée ?

Mon fichier Json ressemble à ceci :

{

  "cards": [
    {
      "subject": "The Earth",
      "questions": [
        {
          "challenge": "What is the highest mountain of the world?",
          "answer": "Everest"
        },
        {
          "challenge": "What is the largest ocean in the world?",
          "answer": "Pacific Ocean"
        }
      ],
      "author": "Roger",
      "theme": "IMPROBABLE"
    },

    {
      "subject": "Holidays",
      "questions": [
        {
          "challenge": "What is the most touristic country in the world?",
          "answer": "France"
        },
        {
          "challenge": "In 2019, how many pictures did vacationers take per day?",
          "answer": "55"
        }
      ],
      "author": "Roger",
      "theme": "PLEASURE"
    }
    
  ]

}

Ma class Main :

public class Main {
  
  public static void main(String[] args) {
    Question question1 = new Question("Roger", Theme.SCHOOL, "Test", "c1", "a1");
    Question question2 = new Question("Roger", Theme.SCHOOL, "Test", "c2", "a2");
    BasicCard bc = new BasicCard("Roger", Theme.SCHOOL, "Test", Arrays.asList(question1,question2));
    
    try {
          File file = new File(Constants.DECK_PATH);
          FileWriter fileWriter = new FileWriter(file, true);

          ObjectMapper mapper = new ObjectMapper();
          SequenceWriter seqWriter = mapper.writerWithDefaultPrettyPrinter().writeValues(fileWriter);
          seqWriter.write(bc);
          seqWriter.close();
      } catch (IOException e) {
          e.printStackTrace();
      }

  }

}

Fichier json après exécution du main

{
 
  "cards": [
    {
      "subject": "The Earth",
      "questions": [
        {
          "challenge": "What is the highest mountain of the world?",
          "answer": "Everest"
        },
        {
          "challenge": "What is the largest ocean in the world?",
          "answer": "Pacific Ocean"
        }
      ],
      "author": "Roger",
      "theme": "IMPROBABLE"
    },
 
    {
      "subject": "Holidays",
      "questions": [
        {
          "challenge": "What is the most touristic country in the world?",
          "answer": "France"
        },
        {
          "challenge": "In 2019, how many pictures did vacationers take per day?",
          "answer": "55"
        }
      ],
      "author": "Roger",
      "theme": "PLEASURE"
    }
  ]
}{
  "subject" : "Test",
  "questions" : [ {
    "challenge" : "c1",
    "answer" : "a1"
  }, {
    "challenge" : "c2",
    "answer" : "a2"
  }, {
    "challenge" : "c3",
    "answer" : "a3"
  }, {
    "challenge" : "c4",
    "answer" : "a4"
  } ],
  "author" : "Damien",
  "theme" : "SCHOOL"
}
wouh_pinaise_
wouh_pinaise_
Niveau 6
30 avril 2021 à 22:20:25

Faut lire la doc ! :hap:

@NoArgsConstructor
@AllArgsConstructor
@Data
class Question {
    private String challenge;
    private String answer;
}

@NoArgsConstructor
@AllArgsConstructor
@Data
class Card {
    private String subject;
    private String author;
    private String theme;
    private List<Question> questions;
}

@NoArgsConstructor
@AllArgsConstructor
@Data
class Survey {
    private List<Card> cards;
}

@Component
public class MyRunner implements CommandLineRunner {

    @Value("file.json")
    Resource resourceFile;

    @Override
    public void run(String... args) throws Exception {
        Question question1 = new Question("aa" , "bb");
        Question question2 = new Question("cc", "dd");
        Card bc = new Card("Subject", "Roger", "SCHOOL", Arrays.asList(question1,question2));

        String fileAsString = Files.readString(resourceFile.getFile().toPath(), StandardCharsets.US_ASCII);
        ObjectMapper objectMapper = new ObjectMapper();
        Survey survey = objectMapper.readValue(fileAsString, Survey.class);
        survey.getCards().add(bc);

        File file = new File("result.json");
        FileWriter fileWriter = new FileWriter(file, true);

        SequenceWriter seqWriter = objectMapper.writerWithDefaultPrettyPrinter().writeValues(fileWriter);
        seqWriter.write(survey);
        seqWriter.close();

    }
}

Ca ne répond pas exactement à ton besoin mais l'idée est la : j'écris le résultat dans un nouveau fichier et ce n'est peut être pas le nom des classes que tu souhaites avoir.
J'utilise spring boot pour lancer l'application et lombok pour ne pas avoir à écrire les getters, setters et constructeurs.

Si tu utilises jackson pour faire ce que tu souhaites, il faut déjà avoir l'équivalent de ta structure json sous forme d'objets java : raison pour laquelle j'ai créé les 3 classes au début de mon exemple.

        String fileAsString = Files.readString(resourceFile.getFile().toPath(), StandardCharsets.US_ASCII);
        ObjectMapper objectMapper = new ObjectMapper();
        Survey survey = new ObjectMapper().readValue(fileAsString, Survey.class);
        survey.getCards().add(bc);

On récupère ici le fichier sous forme de string qu'on transforme en Survey grâce au mapper, et on injecte la card à la liste.
Dans le file.readString, il te suffira juste de faire Files.readString(file.toPath(), StandardCharsets.US_ASCII)

        File file = new File("result.json");
        FileWriter fileWriter = new FileWriter(file, true);

        SequenceWriter seqWriter = objectMapper.writerWithDefaultPrettyPrinter().writeValues(fileWriter);
        seqWriter.write(survey);
        seqWriter.close();

Il suffit ensuite d'écrire l'objet survey qui a été modifié dans le fichier.
Si tu veux écrire le contenu dans le même fichier, tu dois d'abord le nettoyer avant de faire l'écriture. Comme tu l'avais écrit, tu disais juste d'insérer le contenu de ton objet à la fin du fichier.

Message édité le 30 avril 2021 à 22:21:43 par wouh_pinaise_
Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment