【问题标题】:Jackson serialize without properties杰克逊序列化没有属性
【发布时间】:2017-07-16 20:02:56
【问题描述】:

我有一个这样的 json 结构:

{
    "name": "LS",
    "stocks": [
      {
        "x": 1500234365000,
        "y": 0.000000000000
      },
      {
        "x": 1500234427000,
        "y": 0.000015154000
      },
      {
        "x": 1500234481000,
        "y": 0.000015518740
      },
      {
        "x": 1500234548000,
        "y": 0.008415518740
      }
    ]
 }

但我需要我的 json 看起来像这样:

{
    "name": "LS",
    "stocks": [
      [1500234365000,0.000000000000],
      [1500234427000,0.000015154000],
      [1500234481000,0.000015518740],
      [1500234548000,0.008415518740]
    ]
 }

我的映射类:

public class View implements Serializable {
    private static final long serialVersionUID = 1636349140413063122L;

    @Getter @Setter
    private String name;

    @JsonInclude(Include.NON_EMPTY)
    @Getter @Setter
    private List<Data> rates = new ArrayList<Data>();
}

和数据数组:

public class Data implements Serializable {
    private static final long serialVersionUID = 2926346626990185211L;

    @JsonProperty("x")
    @Getter @Setter
    private Long date;

    @JsonProperty("y")
    @Getter @Setter
    private BigDecimal value;

有什么本地方法可以做到吗?我在 stackoverflow 和 jackson 文档中搜索,但没有找到如何删除属性名称。

不知道有没有可能。

不管怎样,我用的是 spring boot 和 jackson

【问题讨论】:

  • 那只是一个二维数组,不是吗?
  • Jolt 非常适合这样的东西:github.com/bazaarvoice/jolt
  • 如果希望JSON字段命名为stocks,不要将Java字段命名为rates,如果希望JSON值是数组数组(二维数组),然后不要将 Java 字段设为 List 的 bean 对象,而是将其设为列表列表、数组列表或数组数组。这样您就不必编写自定义序列化程序了。

标签: java json spring spring-boot jackson


【解决方案1】:

你可以自定义一个json序列化的类

public class MyStdSerializer extends StdSerializer<Data> {

    public MyStdSerializer(){
        this(null);
    }
    public MyStdSerializer(Class<Data> t) {
        super(t);
    }


    @Override
    public void serialize(Data value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonGenerationException {

        jgen.writeStartArray();
        jgen.writeNumber(value.getDate());
        jgen.writeNumber(value.getValue());
        jgen.writeEndArray();

    }

}

然后:

@JsonSerialize(using=MyStdSerializer.class)
public class Data implements Serializable{

     private static final long serialVersionUID = 2926346626990185211L;

        @JsonProperty("x")
        private Long date;

        @JsonProperty("y")
        private BigDecimal value;

        public Long getDate() {
            return date;
        }

        public void setDate(Long date) {
            this.date = date;
        }

        public BigDecimal getValue() {
            return value;
        }

        public void setValue(BigDecimal value) {
            this.value = value;
        }

}

【讨论】:

    【解决方案2】:

    选项 1

    你可以为Data类写一个custom serializer

    public class ItemSerializer extends StdSerializer<Item> {
         
        public ItemSerializer() {
            this(null);
        }
       
        public ItemSerializer(Class<Item> t) {
            super(t);
        }
     
        @Override
        public void serialize(
          Item value, JsonGenerator jgen, SerializerProvider provider) 
          throws IOException, JsonProcessingException {
      
            jgen.writeStartObject();
            jgen.writeNumberField("id", value.id);
            jgen.writeStringField("itemName", value.itemName);
            jgen.writeNumberField("owner", value.owner.id);
            jgen.writeEndObject();
        }
    }
    

    要编写数组,您必须使用 writeStartArraywriteEndArray

        jgen.writeStartArray();
        jgen.writeNumber(id);
        jgen.writeNumber(number1);
        jgen.writeEndArray();
    

    数组写入示例来自here

    然后将其用作您班级的注释:

    @JsonSerialize(using = ItemSerializer.class)
    public class Item {}
    

    选项 2

    解决问题的另一种方法是创建另一个类(如 DTO),它代表您在 json 中需要的确切结构和命名。然后,您可以首先将当前对象映射到新对象(DTO)并序列化 DTO。

    其实我会选择第二种方法,因为:

    1) 发生的事情更加明显。使用 StdSerializer 方法,您的代码阅读器必须发现自定义阅读器的用法,并且可能不熟悉技术等。

    2)如果你使用这些类作为一些rest api的返回类型并使用jackson来序列化它们(如Spring MVC)并且你必须使用一些像Swagger这样的rest文档工具,它会更好地使用DTO方法和可能根本不适用于自定义序列化程序。

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2020-04-16
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多