【问题标题】:How can I return only several Json fields of an inner object with Jackson我怎样才能用杰克逊只返回一个内部对象的几个 Json 字段
【发布时间】:2019-02-18 04:37:05
【问题描述】:

我正在使用 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 中都是百分比。

但是在 Recipient object 的情况下,Json 必须只有 object card 的一部分(例如:pan, holder)。 有没有办法用不同的字段集在 json 中呈现 Card 对象?

使用 @JsonIgnore 之类的注解将从这两种情况中删除字段。

谢谢。

【问题讨论】:

    标签: rest spring-boot jackson


    【解决方案1】:

    再想一想 - 这种方法是否可扩展?如果您再次需要类似的东西怎么办? 为什么不依赖继承并创建一个基类和多个具有您感兴趣的属性的子类?

    class Card{
       // bare min attribute
       .....
    }
    
    class SubCard1 extends Card{
       //add more attribute 
       .....
    }
    
    class SubCard2 extends Card{
       //add more attribute 
       .....
    }
    

    根据需要使用 SubCard1 还是 SubCard2?同样可以用于其他类。如果这更具动态性,请查看设计模式。

    【讨论】:

      【解决方案2】:

      当您序列化对象时,您可以只保留您感兴趣的参数。 我发布了一个简单的 java 代码来解决这些问题,您可以将代码转换为您需要的语言。 以下代码是 Recipient 类的 prt,其中包含两个字段:String nameCard 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);
              }
          }
      

      我试图为你修改代码,但这只是给你一个想法,我希望这对你有用。

      【讨论】:

        猜你喜欢
        • 2016-04-04
        • 2020-02-23
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 2015-04-13
        • 1970-01-01
        相关资源
        最近更新 更多