2013-03-28 3 views
1

В моем приложении у меня есть Serie, и у каждого из них есть 2 поля для представления текстуры и файла .obj.Как развернуть JsonObject с помощью одного элемента и сохранить имя JsonObject с помощью библиотеки Jackson?

@Entity 
public class Serie extends Model { 
    public File obj; 
    public File texture; 
} 

И мой класс файла:

@Entity 
public class File extends Model{ 
    public String path; 
} 

Я хотел бы создать файл JSON, чтобы описать свои объекты. Как вы можете видеть, класс File имеет ровно одно поле. По этой причине я хочу создать Json без JsonArray, чтобы описать мои поля файлов.

Использование библиотеки Джексона, он генерирует JSON так:

{"obj":{"path":"obj/600s"}, "texture":{"path":"text/600s"}} 

Я хотел бы произвести так:

{"obj":"obj/600s", "texture":"text/600s"} 

Один из вариантов, который работает частично является использование аннотаций @JsonUnwrapped в Джексоне.

@Entity 
public class Serie extends Model { 

    @JsonUnwrapped 
    public File obj; 

    public File texture; 
} 

С его помощью Джексон генерировать JSON вроде этого:

{"path":"obj/600s", "texture":{"path":"text/600s"}} 

Так что это не работает для меня, потому что я не могу использовать для OBJ, текстуры полей, и я хочу сохранить имена полей на json.

Я знаю, что это конкретный вопрос. В любом случае, спасибо заранее

ответ

2

Вы можете написать пользовательские добытчик для достижения своей цели:

public class Serie extends Model { 
    public File obj; 
    public File texture; 

    @JsonProperty("obj") 
    public String getObjPath() { 
     return obj.path; 
    } 

    @JsonProperty("texture") 
    public String getTexturePath() { 
     return texture.path; 
    } 
} 

/Я предполагаю, что автоопределение выключено/

+0

Спасибо, человек! Отлично. Это простое решение. Я думал о действительно сложных вещах;) –

1

То, что вы хотите использовать вместо этого @JsonValue, но в аннотации не может быть установлен на поле, только по методу (геттер):

@Entity 
public static class File { 
    public String path; 

    @JsonValue 
    public String getPath() { 
     return path; 
    } 

}

Если вам нужна сериализация, то это все, что вам нужно сделать. Если вы также нуждаетесь в десериализации, вам понадобится один-arg String Constructor или статический заводский метод для json, чтобы иметь возможность десериализовать ваши данные.

+0

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

+0

Что это значит? Я проверил это с классами, которые вы предоставили, и работает хорошо ... –

0

Другим решение:

@Entity 
@JsonSerialize(using=com.fasterxml.jackson.databind.ser.std.ToStringSerializer) 
public class File extends Model{ 
    public String path; 

    // Could be generated by lombok: 
    File(String path) { 
     this.path = path; 
    } 

    @Override public String toString() { 
     return path; 
    } 
} 
Смежные вопросы