如何使用高性能解析器解析Java中的JSON?

时间:2018-09-18 21:02:43

标签: java json

我的输入是一个大约有一个数组。每秒接收2,000个元素,有时每秒接收几次。数组的每个元素都有3个大十进制。

Jackson(com.fasterxml)是其他毫秒级应用程序中最慢的部分,耗时15毫秒(avg)。慢速功能是objectMapper.readValue(text,MyDto.class);

使用基于子字符串的自定义JSON解析算法时,需要花费微秒。使用ObjectMapper可以达到15毫秒。

通过子字符串解析JSON是一种不好的做法,因为代码冗长且容易出现错误。

您将使用什么进行JSON解析?要求是一种非常快速的算法。

https://github.com/ngs-doo/dsl-json我找到了DSL json,但不知道使它能够将带有JSON的String解析到我的DTO中很热。我还没有找到一种简单的快速算法来将JSON从String解析为DTO。

编辑:要解析的输入在:

https://pastebin.com/831YtBdq

代码:

public class BitstampOrderBook {
    private long timestamp;
    private List<List<BigDecimal>> bids;
    private List<List<BigDecimal>> asks;

    public BitstampOrderBook() {

    }

    public BitstampOrderBook(long timestamp, List<List<BigDecimal>> bids, List<List<BigDecimal>> asks) {
        this.timestamp = timestamp;
        this.bids = bids;
        this.asks = asks;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public List<List<BigDecimal>> getBids() {
        return bids;
    }

    public List<List<BigDecimal>> getAsks() {
        return asks;
    }
}

public class BitstampOrder {
    private BigDecimal price;

    private BigDecimal amount;

    private String datetime;

    private int id;

    @SerializedName("order_type")
    private int orderType;

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public String getDatetime() {
        return datetime;
    }

    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getOrderType() {
        return orderType;
    }

    public void setOrderType(int orderType) {
        this.orderType = orderType;
    }

    @Override
    public String toString() {
        return "BitStampOrder{" +
                "price=" + price +
                ", amount=" + amount +
                ", datetime='" + datetime + '\'' +
                ", id='" + id + '\'' +
                ", orderType='" + orderType + '\'' +
                '}';
    }
}

主要:

BitstampOrderBook orderBook = objectMapper.readValue(jsonString, BitstampOrderBook.class);

JProfiler(杰克逊):

https://i.imgur.com/mjdbDQe.png

编辑2:

JProfiler(Gson):

https://i.imgur.com/WcHVhhd.png

从JProfiler可以看出,Gson比Jackson快几倍。会比Gson还要快?

0 个答案:

没有答案