package com.jsoniter.demo; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.module.afterburner.AfterburnerModule; import com.jsoniter.JsonIterator; import com.jsoniter.ReflectionDecoderFactory; import com.jsoniter.annotation.JacksonAnnotationSupport; import com.jsoniter.spi.EmptyExtension; import com.jsoniter.spi.JsoniterSpi; import com.jsoniter.spi.ParameterizedTypeImpl; import com.jsoniter.spi.TypeLiteral; import org.junit.Test; import org.openjdk.jmh.Main; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.io.IOException; import java.lang.reflect.Type; import java.util.LinkedList; import java.util.List; @State(Scope.Thread) public class PrivateFieldBinding { private TypeLiteral<TestObject> typeLiteral; private ObjectMapper jackson; private byte[] input; private TypeReference<TestObject> typeRef; private String inputStr; public static class TestObject { @JsonProperty private int field1; @JsonProperty private int field2; @Override public String toString() { return "TestObject1{" + "field1=" + field1 + ", field2=" + field2 + '}'; } } private JsonIterator iter; @Setup(Level.Trial) public void benchSetup() { inputStr = "{'field1':100,'field2':101}"; input = inputStr.replace('\'', '"').getBytes(); iter = JsonIterator.parse(input); typeLiteral = new TypeLiteral<TestObject>() { }; typeRef = new TypeReference<TestObject>() { }; JacksonAnnotationSupport.enable(); JsoniterSpi.registerTypeDecoder(TestObject.class, ReflectionDecoderFactory.create(TestObject.class)); jackson = new ObjectMapper(); jackson.registerModule(new AfterburnerModule()); } @Test public void test() throws IOException { JsoniterSpi.registerExtension(new EmptyExtension() { @Override public Type chooseImplementation(Type type) { if (ParameterizedTypeImpl.isSameClass(type, List.class)) { return ParameterizedTypeImpl.useImpl(type, LinkedList.class); } else { return type; } } }); benchSetup(); System.out.println(withJsoniter()); System.out.println(withJackson()); } @Benchmark public void withJsoniter(Blackhole bh) throws IOException { bh.consume(withJsoniter()); } @Benchmark public void withJackson(Blackhole bh) throws IOException { bh.consume(withJackson()); } public static void main(String[] args) throws Exception { Main.main(new String[]{ "PrivateFieldBinding.*", "-i", "5", "-wi", "5", "-f", "1", }); } private TestObject withJsoniter() throws IOException { iter.reset(input); return iter.read(typeLiteral); } private TestObject withJackson() throws IOException { return jackson.readValue(input, typeRef); } }