Сериализация Джексона и десериализация стороннего класса без написания собственного сериализатора и / или десериализатора - PullRequest
1 голос
/ 20 октября 2019

Этот вопрос, вероятно, будет звучать как дубликат, но я не могу собрать воедино полное решение своей проблемы.

Я пытался использовать пользовательские классы ser / deser, но это очень быстро утомительно (и терпит поражениеавтоматизация, которую должен обеспечить Джексон), и я попробовал миксины, но, может быть, я чего-то упустил.

Я бы даже смог попробовать другую библиотеку json, если она может сериализовать и десериализовать 3-ю. классы для вечеринок, которые я показал без особых усилий.

Я пробовал это. В результате возникает StackOverflowError.

ObjectMapper om = new ObjectMapper();
om.addMixIn(Word.class, WordMixin.class);
String ser = om.writeValueAsString(t);
Word r = om.readValue(ser, Word.class);

Я пробовал это. В результате выдается исключение InvalidDefinitionException: невозможно создать экземпляр net.sourceforge.tess4j.Word (создатели, такие как создание по умолчанию, не существует): невозможно десериализовать из значения объекта (без создателя на основе делегатов или свойств)

ObjectMapper om = new ObjectMapper();
om.setVisibility(om.getSerializationConfig().getDefaultVisibilityChecker()
    .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
    .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
    .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
    .withCreatorVisibility(JsonAutoDetect.Visibility.PUBLIC_ONLY));
String ser = om.writeValueAsString(t);
Word r = om.readValue(ser, Word.class);

Мой класс по миксину

public static class WordMixin {
        @JsonCreator
        public WordMixin(@JsonProperty String text, @JsonProperty float confidence, @JsonProperty Rectangle rect){}
    }

Урок третьей стороны.

public class Word {

    private final String text;
    private final float confidence;
    private final Rectangle rect;

    public Word(String text, float confidence, Rectangle boundingBox) {
        this.text = text;
        this.confidence = confidence;
        this.rect = boundingBox;
    }

    public String getText() {
        return text;
    }

    public float getConfidence() {
        return confidence;
    }

    public Rectangle getBoundingBox() {
        return rect;
    }

    @Override
    public String toString() {
        return String.format("%s [Confidence: %f Bounding box: %d %d %d %d]", text, confidence, rect.x, rect.y, rect.width, rect.height);
    }
}

1 Ответ

1 голос
/ 20 октября 2019

Вы должны зарегистрировать выделенный Mixin для java.awt.Rectangle и добавить @JsonIgnore для bounds2D, чтобы остановить рекурсию, которая вызывает StackOverflow.

Посмотрите на код:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.awt.*;
import java.io.IOException;

public class WordTest {

    public static void main(String[] args) throws IOException {
        ObjectMapper om = new ObjectMapper();
        om.addMixIn(Rectangle.class, RectangleMixin.class);
        om.addMixIn(Word.class, WordMixin.class);

        Word word = new Word("t1", 12, new Rectangle(1, 3));
        String ser = om.writeValueAsString(word);
        Word r = om.readValue(ser, Word.class);
    }
}

RectangleMixin.java :

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.awt.geom.Rectangle2D;

@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class RectangleMixin {

    @JsonProperty("width")
    public abstract double getWidth();

    @JsonProperty("height")
    public abstract double getHeight();

    @JsonIgnore
    public abstract Rectangle2D getBounds2D();
}

WordMixin.java :

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.awt.*;

public abstract class WordMixin {
    @JsonCreator
    public WordMixin(@JsonProperty("text") String text, @JsonProperty("confidence") float confidence,
                     @JsonProperty("boundingBox") Rectangle boundingBox) {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...