我有一个像这样的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文档搜索,但没有发现如何删除属性名称。
不知道是否可能。
无论如何,我使用带杰克逊的弹簧靴
答案 0 :(得分:1)
选项1
您可以为数据类
编写custom serializerpublic 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)如果你使用这些类作为某些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;
}
}