2

У меня есть модель, которая выглядит следующим образом (Play 2.1.1 Java ebean)Джексон сериализации и десериализации строковое свойство, как JSON

@Entity 
public class Link extends Model { 
    @Id 
    public Long id; 

    @Lob 
    public String points; 
} 

, где точки является сырьевым JSON строка, содержащая х, у координаты в массиве ,

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

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

В контроллере:

// Serialize 
List<Link> links = Link.findAll(); 
return ok(Json.toJson(links)); 

// Deserialize 
Link link = Json.fromJson(request().body().asJson(), Link.class); 

Как мне это сделать?

Пользовательский сериализатор, десериализатор?

@JsonRawValue?

Любые другие аннотации?

+0

Просто немного комментария: Вы можете отправить его в виде строки JSON, так же, как она есть, и он десериализация в ваш интерфейс очень легко использует JavaScript (или jQuery, например), если это ваш случай. Это соответствует вашим потребностям? Это всего лишь одна дополнительная строка кода в вашем клиенте ... – Azurlake

+0

Я использую angular.js и ngResource, что означает, что я не выполняю запросы самостоятельно, поэтому я бы не стал прибегать к этому. но спасибо anyways :) –

ответ

3

Ответ был намного проще, чем вы подозревали.

@Lob 
public String points; 

public JsonNode getPoints() { 
    return Json.parse(StringUtils.isBlank(points) ? "[]" : points); 
} 

@JsonSetter 
public void setPoints(JsonNode json) { 
    points = json.toString(); 
} 

Хотя я не так увлекаюсь геттерами и сеттерами, это работает.

Если у кого есть лучшее решение, которое является более общим, не стесняйтесь отправлять другой ответ :)

Смежные вопросы