【发布时间】:2020-11-14 07:19:59
【问题描述】:
我正在从一个流中读取数据,该流为用于计算市场深度的订单簿提供更新。每个都包括订单簿的新条目列表。 每个条目包含三个属性。
- 市场方面(例如买入或卖出)
- 商品交易数量
- 本次交易商品的单价
这些条目在 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。
如何在 Java 8 中使用数组 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 类型的类型定义无效:参数 #0 没有属性名称,不可注入:不能用作 Creator [com.example.OrderBookEntry 的构造函数,注释:{interface com.fasterxml.jackson. annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] 在 [Source: (String)"["buy","470.84724800000004","16.14963"]";行:1,列:1]
有没有办法只用注释来做到这一点?
附注(咆哮)
我想补充一下,这是一个荒谬的数据结构。毫无意义。使用数组索引而不是对象字段名称的目的是减少消息的大小。这是一个金融数据流,任何对金融数据网络延迟的改进都是可取的。但是,围绕这些数组中的每一个都是一个完全多余的包装对象,具有一个命名字段。这会为每个条目增加至少 10 个字节的不必要流量。数据结构的设计很差。
【问题讨论】:
标签: java data-annotations json-deserialization jackson-databind