首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jackson注释-通过将索引映射到属性作为对象

Jackson注释-通过将索引映射到属性作为对象
EN

Stack Overflow用户
提问于 2020-11-14 07:19:59
回答 1查看 805关注 0票数 0

我正在从一个流中阅读,它提供了一本用于计算市场深度的订单的更新。每一项都包括订单簿的新条目列表。每个条目包含三个属性.

  1. 市场部(例如买卖)
  2. 在此交易中交易商品
  3. 单价的数量

这些条目在JSON中表示为数组节点。下面是如何提供条目的示例。

代码语言:javascript
运行
复制
{
    "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注释来反/序列化这些数组?,我只是询问最内部的数组。一般情况下,我不需要帮助对象结构。

我试着做了一个类似于下面的类。

代码语言:javascript
运行
复制
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个字节的不必要通信量。数据结构的设计非常糟糕。

EN

回答 1

Stack Overflow用户

发布于 2020-11-14 07:53:37

有不止一种方法可以做到这一点,但我总是喜欢将专用类与专用序列化程序组合在一起。其他备选办法是:

使用annotations

  • use注册序列化程序--显式编码而不是(元级别)--一个通用的set方法(使用Map) --将序列化程序的方面隐藏在一个冗长的方法中--在父类中使用setter映射JsonNode --比如#2

相反:

代码语言:javascript
运行
复制
@JsonDeserialize(using = OrderBookEntryDeserializer.class)
public class OrderBookEntry {
  // no further Jackson-annotations necessary
}

而序列化程序:

代码语言:javascript
运行
复制
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旁边)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64831742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档