我正在从一个流中阅读,它提供了一本用于计算市场深度的订单的更新。每一项都包括订单簿的新条目列表。每个条目包含三个属性.
这些条目在JSON中表示为数组节点。下面是如何提供条目的示例。
{
"Changes": [
{ "entry": ["buy","470.84724800000004","16.14963"] },
{ "entry": ["buy","470.787392","0.01"] },
{ "entry": ["sell","473.112752","9.325423"] },
{ "entry": ["sell","473.052608","11.80723"] }
],
...some more fields; not relevant to this question...
}
如您所见,每个条目数组的索引都用作字段名。每个数组元素的位置定义了它所代表的属性,的边在索引0,单价在索引1,数量在索引2。
如何使用Java8中的数组Jackson注释来反/序列化这些数组?,我只是询问最内部的数组。一般情况下,我不需要帮助对象结构。
我试着做了一个类似于下面的类。
public class OrderBookEntry {
final String side;
final BigDecimal price;
final BigDecimal quantity;
@JsonCreator
public OrderBookEntry(@JsonProperty(index = 0, required = true) String side,
@JsonProperty(index = 1, required = true) BigDecimal price,
@JsonProperty(index = 2, required = true) BigDecimal quantity) {
this.side = side;
this.price = price;
this.quantity = quantity;
}
}
我已经尝试在类中指定@JsonFormat.Shape.ARRAY
。每次我试图反序列化一个示例字符串时,我都会得到一个InvalidDefinitionException
。
线程“主”com.fasterxml.jackson.databind.exc.InvalidDefinitionException:中的
异常
无效的类型定义为com.example.OrderBookEntry: com.example.OrderBookEntry #0没有属性名,不可注入:不能用作com.example.OrderBookEntry的创建者构造函数,注释:{接口com.example.OrderBookEntry:(字符串)“购买”,"470.84724800000004",“16.14963”;行: 1,列: 1]
难道没有办法只使用注释就可以做到这一点吗?
P.S. (咆哮)
我想补充的是,--这是一个荒谬的数据结构。这是没有意义的。使用数组索引而不是对象字段名的目的是减少消息的大小。这是一个金融数据流,对财务数据的网络延迟进行任何改进都是可取的。但是,每个数组周围都是一个完全多余的包装器对象,只有一个命名字段。这会在每个条目中增加至少10个字节的不必要通信量。数据结构的设计非常糟糕。
发布于 2020-11-14 07:53:37
有不止一种方法可以做到这一点,但我总是喜欢将专用类与专用序列化程序组合在一起。其他备选办法是:
使用annotations
相反:
@JsonDeserialize(using = OrderBookEntryDeserializer.class)
public class OrderBookEntry {
// no further Jackson-annotations necessary
}
而序列化程序:
class OrderBookEntryDeserializer extends StdDeserializer<OrderBookEntry> {
OrderBookEntryDeserializer() {
super(OrderBookEntry.class);
}
@Override
public OrderBookEntry deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
final JsonNode node = p.getCodec().readTree(p);
// now follow Jackson API to turn the node into
// an ArrayNode, there are plenty of is-methods
// and it requires a hard cast.
}
我的示例使用了一个包私有反序列化类,它非常好地工作,并将它锁在它的包中(最好在OrderBookEntry旁边)。
https://stackoverflow.com/questions/64831742
复制相似问题