Как я могу вернуть только несколько полей Json внутреннего объекта с Джексоном - PullRequest
0 голосов
/ 13 сентября 2018

Я использую Jackson + spring RestControlles

Допустим, у меня есть 3 класса

class Card {
   String id;
   String pan;
   String holder;
   String expiry;
}

class CardProfile {
   String id;
   Card card;
   ...
}

class Recipient {
   String name;
   Card card;
   ...
}

Поэтому, когда я сериализирую объект CardProfile, я хочу, чтобы все поля объектной карты были в процентах врезультат JSON.

Но в случае объекта-получателя у Джсона должна быть только часть карточки объекта (например, панорамирование, держатель).Есть ли способ представить объект Card в json с другим набором полей?

Использование аннотаций типа @JsonIgnore удалит поля из обоих случаев.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Подумав еще раз - масштабируется ли этот подход? Что если вам снова понадобится нечто подобное? Почему бы не полагаться на наследование и создать базовый класс и несколько подклассов с интересующими вас атрибутами?

class Card{
   // bare min attribute
   .....
}

class SubCard1 extends Card{
   //add more attribute 
   .....
}

class SubCard2 extends Card{
   //add more attribute 
   .....
}

Использовать SubCard1 или SubCard2 в зависимости от того, что вам нужно? То же самое можно использовать для других классов. Если это более динамично - посмотрите на шаблоны проектирования.

0 голосов
/ 13 сентября 2018

при сериализации объекта вы можете сохранить только тот параметр, который вас интересует.Я публикую простой код Java, чтобы решить эту проблему, вы можете преобразовать код в нужный вам язык.следующий код является prt класса Recipient, который содержит два поля: String name и Card card Для записи объекта json:

    @Override
public final void toJSON(final OutputStream out) throws IOException {
    final JsonGenerator jg = JSON_FACTORY.createGenerator(out);
    jg.writeStartObject();
    jg.writeFieldName("Recipient");
    jg.writeStartObject();
    jg.writeNumberField("id",card.getID());
    jg.writeStringField("name", name);
    jg.writeStringField("pan", card.getPan());
    jg.writeStringField("holder", card.getHolder());
    jg.writeEndObject();
    jg.writeEndObject();
    jg.flush();
}

для получения объекта из json:

  public static Recipient fromJSON(final InputStream in) throws IOException {
        int jId = -1;
        String jName = null;
        String jHolder = null;
        String jPan = null;
        //Obtain a new JsonParser to parse Recipient from JSON
        final JsonParser jp = JSON_FACTORY.createParser(in);
        while (jp.getCurrentToken() != JsonToken.FIELD_NAME || "Recipient".equals(jp.getCurrentName()) == false) {
                // there are no more events
                if (jp.nextToken() == null) {
                    throw new IOException("Unable to parse JSON: no employee object found.");
                }
        }
        while (jp.nextToken() != JsonToken.END_OBJECT) {
                if (jp.getCurrentToken() == JsonToken.FIELD_NAME) {
                    switch (jp.getCurrentName()) {
                        case "id":
                            jp.nextToken();
                            jId = jp.getIntValue();
                            break;
                        case "name":
                            jp.nextToken();
                            jName = jp.getText();
                            break;
                        case "pan":
                            jp.nextToken();
                            jPan = jp.getText();
                            break;
                        case "holder":
                            jp.nextToken();
                            jHolder = jp.getText();
        break; }
        } }
            //create new card object, the values not present in the json will set to null
            Card card = new Card(jId,null,jPan,jHolder,null);
            return new Recipient(jName, card);
        }
    }

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

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