Разбор объектов JSON: вызвать конструктор после анализа? - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть следующий класс POJO для объекта JSON:

public class JSONChangeSet {

    public JSONChangeSet {
       System.out.println("Owner: " + owner);
    }

    @SerializedName("comment")
    private String comment;

    @SerializedName("lastUpdatedDate")
    private String modifiedDate;

    @SerializedName("owner")
    private Resource owner;

    @SerializedName("modifiedBy")
    private Resource modifier;

    public String getComment() {
        return comment;
    }

}

Очевидно, это не работает, потому что владельцу поля еще не присвоено значение при вызове конструктора.Есть ли возможность автоматического вызова метода после анализа объекта JSON?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Вы пометили свой вопрос с помощью gson, но я бы порекомендовал вам библиотеку Джексона , потому что я видел ваши два последних вопроса и кажется, что gson недостаточно гибок для вас.* В Джексоне ваш пример будет выглядеть так:

public final class JSONChangeSet {
  private final String comment;
  private final Resource owner;

  @JsonCreator
  public JSONChangeSet(
    @JsonProperty("comment") final Resource owner,
    @JsonProperty("comment") final String comment
  ) {
    this.comment = comment;
    this.owner = owner;
  }

  public String getComment() {
    return comment;
  }
}

С этим решением вы можете иметь неизменяемые объекты, которые будут построены конструктором.Это также хорошо для паттерна DI.И, кстати, Джексон молниеносно.

Вы можете прочитать этот вопрос также.

1 голос
/ 09 декабря 2011

Я думаю, что у Gson нет «слушателя» для этого. Вы можете попробовать следующий трюк:

static class JSONChangeSet {

    @SerializedName("comment")
    private String comment;

    @SerializedName("owner")
    private int owner;

}

static class JSONChangeSetDeserializer implements JsonDeserializer<JSONChangeSet> {
    Gson gson = new Gson();

    @Override
    public JSONChangeSet deserialize(final JsonElement json, final Type typeOfT,
            final JsonDeserializationContext context) throws JsonParseException {
        final JSONChangeSet obj = gson.fromJson(json, typeOfT);

        // Code you want to run
        System.out.println("Owner: " + obj.owner);

        return obj;
    }
}

public static void main(final String[] args) throws Exception, JsonMappingException, IOException {

    final GsonBuilder gson = new GsonBuilder();
    gson.registerTypeAdapter(JSONChangeSet.class, new JSONChangeSetDeserializer());

    gson.create().fromJson("{\"comment\": \"it works!\", \"owner\": 23}", JSONChangeSet.class);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...