Джексон JSON: сериализовать определенные свойства в другом представлении?

если у меня есть класс под названием «TreeNode» с переменной экземпляра (среди прочего), называемой «детьми», которая представляет собой массив других TreeNodes, есть ли способ, чтобы я мог сериализовать экземпляр TreeNode под одним JsonView, но сериализовать все TreeNodes в моем «детском» массиве под другим JsonView?

Я пытаюсь выполнить следующее: когда я сериализую один TreeNode, я хочу, чтобы все свойства в этом TreeNode были сериализованы, включая список его дочерних элементов, но я не хочу, чтобы все свойства дочерних элементов были сериализованы (например, дочерний массив "дети"). По сути, если я сериализую TreeNode, я хочу видеть только этот TreeNode и дочерние элементы на один уровень ниже. В дочерних элементах также есть другие свойства, которые я хотел бы скрыть, только когда они сериализуются как часть массива «дочерние элементы».

Есть ли способ сделать это с помощью JsonViews или какой-либо другой функции Джексона? Спасибо


person 755    schedule 26.07.2013    source источник
comment
Я ответил на вопрос об этом некоторое время назад, может помочь? stackoverflow.com/ вопросов/14774909/ - вы можете создать подкласс, используя JsonViews (на самом деле, перечитывая... так как это рекурсивная ссылка, я не знаю, что это будет)   -  person Brian Roach    schedule 26.07.2013


Ответы (1)


Для пользовательской логики сериализации вам придется реализовать собственный JsonSerializer.

Например:

public class TreeNodeSerializer extends JsonSerializer<TreeNode> {

    @Override
    public void serialize(TreeNode value, JsonGenerator generator,
                          SerializerProvider provider) throws IOException,             JsonProcessingException {

        generator.writeStartObject();
        generator.writeStringField("value", value.getValue());
        generator.writeNumberField("numValue", value.getNumValue());

        generator.writeArrayFieldStart("children");
        for(TreeNode child : value.getChildren()) {
            generator.writeStringField("value", child.getValue());
            generator.writeNumberField("numValue", child.getNumValue());
        }
        generator.writeEndArray();

        generator.writeEndObject();
    }
}
person Vivin Paliath    schedule 26.07.2013