Играть! фреймворк renderJson не раскрывает определенные поля - PullRequest
2 голосов
/ 09 сентября 2011

Я пытаюсь выставить динамическое (переходное) поле в моих моделях через renderJson (), но это не работает.Вот пример:

@Entity
public class Room extends Model {

  public String name;
  public String code;
  @Transient
  public List<Booking> bookings;

  @Transient
  @Expose
  public String resource_uri;

  public Room(String name, String code) {
    this.name = name;
    this.code = code;
  }

  public List<Booking> getBookings() {
    return Booking.find("byRoom", this).fetch();
  }

  public String getResource_uri(){
    return "/api/room/" + this.id; //the uri is evaluated dynamically.
  }

Вызов renderJson (Room.findById (2)) отображает это как ответ:

{"name":"Room B","code":"R-B","id":2}

Поле resource_uriотсутствует.Кажется, аннотация @Expose ничего не делает.И я не могу просмотреть объявление renderJson, так как фреймворк генерирует весь код аннотациями.

Ответы [ 3 ]

1 голос
/ 10 сентября 2011

Играть!использует Gson.Он не сериализует переходные поля.

Взгляните на https://sites.google.com/site/gson/gson-user-guide#TOC-Object-Examples

Мне нравится Gson, потому что он поставляется с Play!из коробки.Вы можете создать свой собственный адаптер, например:

public class RoomAdapter implements JsonDeserializer<Room>, JsonSerializer<Room> {
    public Room deserialize(JsonElement json, Type type, JsonDeserializationContext context){
        // Parse the Json to build a Room
    }

    public JsonElement serialize(Room room, Type type, JsonSerializationContext context){
        // Insert magic here!!
    }
}

Зарегистрируйте сериализатор:

Gson gson = new GsonBuilder().registerTypeAdapter(
            Room.class, new RoomAdapter()).create();

И используйте gson, указав класс, который вы хотите сериализовать:

String jsonRoom = gson.toJson(aRoom, Room.class);
Room aRoom = gson.fromJson(jsonRoom, Room.class);
1 голос
/ 30 сентября 2012

Play Framework 2.0 использует Джексона для создания строки JSON.Используйте аннотацию @JsonIgnore для полей, которые вы не хотите выставлять

1 голос
/ 09 сентября 2011

Кажется, есть несоответствие в ваших объявлениях полей, у вас есть

@Transient
@Expose
public String resource_uri;

Тем не менее, у вас также есть

public String getResource_uri(){
   return "/api/room/" + this.id; //the uri is evaluated dynamically.
}

Это может означать, что ваше поле resource_uri всегда равно нулю?

...