Как добавить переменную JSON root во время выполнения в Джексоне - PullRequest
0 голосов
/ 10 февраля 2020

Прямо сейчас я хочу иметь несколько слов со связанными с ними значениями, такими как, например, «Счастливый», «Безумный» и т. Д. 1015 *, за исключением того, что я не буду знать, какие именно. Я хочу записать данные в файл JSON, однако использование @JsonRootName не будет работать, поскольку аннотации не будут принимать переменные.

Есть ли способ сделать это?

В настоящее время У меня есть следующее:

    /**
     * @author VeeAyeInIn
     *
     * Words will be valued on a scale of [-1.0, 1.0] representing whether they count towards a specific emotion, or
     * against it. The farther towards 1.0 the score goes, the more weight for the emotion exists, whilst the farther
     * it goes to -1.0, is more weight against the emotion. 0 has no weight, and will essentially just add more overall
     * weight towards the sentence as a whole, but does not effect the score.
     */
    public static class ValuedWord {

        /*
         * This uses 7 scores for a word, based off of the Chinese text, "Book of Rites," which mentioned seven 'feelings
         * of men.' These will be the 'primary' emotions, whilst more complex ones will be based off of the scores of
         * these seven.
         */
        public double joy;
        public double anger;
        public double sadness;
        public double fear;
        public double love;
        public double disliking;
        public double liking;

        /*
         * How many times it has been used, to prevent dramatic jumps in calculation, larger uses will cause a smaller
         * change in scores. Eventually it will settle out into a logarithmic curve-like format.
         */
        public long uses;

        /**
         * Default constructor for reading JSON values.
         */
        public ValuedWord() {}

        /**
         * Create a valued word from predefined values.
         *
         * @param joy Score [-1.0, 1.0] for joy
         * @param anger Score [-1.0, 1.0] for anger
         * @param sadness Score [-1.0, 1.0] for sadness
         * @param fear Score [-1.0, 1.0] for fear
         * @param love Score [-1.0, 1.0] for love
         * @param disliking Score [-1.0, 1.0] for disliking
         * @param liking Score [-1.0, 1.0] for liking
         * @param uses How many times the word has been updated
         */
        public ValuedWord(double joy, double anger, double sadness, double fear, double love, double disliking, double liking, long uses) {
            this.joy = joy;
            this.anger = anger;
            this.sadness = sadness;
            this.fear = fear;
            this.love = love;
            this.disliking = disliking;
            this.liking = liking;
            this.uses = uses;
        }
    }

В таком случае это в идеале должно быть превращено в ...

{
  "VARIABLE_WORD" : {
    "joy" : 0.0,
    "anger" : 0.8,
    "sadness" : 0.0,
    "fear" : 0.0,
    "love" : 0.0,
    "disliking" : 0.0,
    "liking" : 0.0,
    "uses" : 0
  }
}

И это, наконец, подводит меня к тому, где я пишу / читаю значения,

    public void write(String s) throws IOException {
        ValuedWord temp = new ValuedWord(0,0.8,0,0,0,0,0,0);
        generator.writeObject(temp);
    }

    public ValuedWord read(String s) throws IOException {
        return mapper.readValue(new BufferedReader(new FileReader(path.toFile())), ValuedWord.class);
    }

Я могу sh Я мог бы что-то сделать с 's', однако я не могу найти какие-либо методы, которые принимают 'root' для этого.

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете использовать ObjectWriter для создания динамического c root имени элемента.

public void write(String s) throws IOException {
    ValuedWord temp = new ValuedWord(0,0.8,0,0,0,0,0,0);
    ObjectWriter objectWriter = objectMapper.writer().withRootName(s);
    String json = objectWriter.writeValueAsString(temp);
    // Enhance your generator code to handle the json string
    generator.writeObject(json);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...