2017-07-16 114 views
1

我有一个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和杰克逊文档,但没有发现如何删除属性名称。

不知道它是否可能。

总之,使用弹簧启动与杰克逊

+1

这只是一个二维数组,不是吗? –

+0

Jolt非常适合这样的东西:https:// github。com/bazaarvoice/jolt –

+0

如果您希望将JSON字段命名为'stocks',请不要将Java字段命名为'rates',并且如果您希望JSON值是数组(数组)的数组,则不要不要让Java字段成为Bean对象的List,而是将它作为列表,列表或数组的列表。那么你将不必编写自定义序列化程序。 – Andreas

回答

1

U可以自定义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; 
     } 

} 
1

选项IM 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(); 
    } 
} 

要写出你必须使用writeStartArray数组和writeEndArray

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)如果您使用这些类作为某些其余api的返回类型并使用杰克逊为了序列化它们(比如Spring MVC)并且必须使用一些其他文档工具(如Swagger),使用DTO方法可以更好地工作,并且可能根本无法使用自定义序列化器。