杰克逊序列化没有属性

时间:2017-07-16 20:02:56

标签: java json spring spring-boot jackson

我有一个像这样的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文档搜索,但没有发现如何删除属性名称。

不知道是否可能。

无论如何,我使用带杰克逊的弹簧靴

2 个答案:

答案 0 :(得分:1)

选项1

您可以为数据类

编写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这样的休息文档工具,它将更好地使用DTO方法和可能无法使用自定义序列化程序。

答案 1 :(得分: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;
        }

}