package com.jsoniter.demo; import com.jsoniter.DecodingMode; import com.jsoniter.spi.JsonException; import com.jsoniter.JsonIterator; import com.jsoniter.annotation.JsonProperty; import com.jsoniter.annotation.JsonObject; import com.jsoniter.annotation.JsoniterAnnotationSupport; import com.jsoniter.spi.TypeLiteral; import org.junit.Assert; import org.junit.Test; import org.openjdk.jmh.Main; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.io.IOException; @State(Scope.Thread) public class FieldMatching { private TypeLiteral<TestObject0> testObject0Type; private TypeLiteral<TestObject1> testObject1Type; private TypeLiteral<TestObject2> testObject2Type; private TypeLiteral<TestObject3> testObject3Type; private TypeLiteral<TestObject4> testObject4Type; private JsonIterator iter0; private JsonIterator iter1Success; private byte[] iter0Input; private byte[] iter1SuccessInput; public static class TestObject0 { public int field1; public int field2; public int field3; } public static class TestObject1 { @JsonProperty(required = true) public int field1; @JsonProperty(required = true) public int field2; @JsonProperty(required = true) public int field3; } @JsonObject(asExtraForUnknownProperties = true) public static class TestObject2 { public int field1; public int field2; } @JsonObject(asExtraForUnknownProperties = true, unknownPropertiesWhitelist = {"field2"}) public static class TestObject3 { public int field1; } @JsonObject(unknownPropertiesBlacklist = {"field3"}) public static class TestObject4 { public int field1; } @Setup(Level.Trial) public void benchSetup() { JsoniterAnnotationSupport.enable(); JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_STRICTLY); iter0Input = "{'field1':101,'field2':101,'field3':101}".replace('\'', '"').getBytes(); iter0 = JsonIterator.parse(iter0Input); iter1SuccessInput = "{'field1':101,'field2':101,'field3':101}".replace('\'', '"').getBytes(); iter1Success = JsonIterator.parse(iter1SuccessInput); testObject0Type = new TypeLiteral<TestObject0>() { }; testObject1Type = new TypeLiteral<TestObject1>() { }; testObject2Type = new TypeLiteral<TestObject2>() { }; testObject3Type = new TypeLiteral<TestObject3>() { }; testObject4Type = new TypeLiteral<TestObject4>() { }; } @Test public void test() throws IOException { benchSetup(); try { JsonIterator iter1Failure = JsonIterator.parse("{'field2':101}".replace('\'', '"').getBytes()); iter1Failure.read(testObject1Type); Assert.fail(); } catch (JsonException e) { System.out.println(e); } try { JsonIterator iter2Failure = JsonIterator.parse("{'field1':101,'field2':101,'field3':101}".replace('\'', '"').getBytes()); iter2Failure.read(testObject2Type); Assert.fail(); } catch (JsonException e) { System.out.println(e); } try { JsonIterator iter3Failure = JsonIterator.parse("{'field1':101,'field2':101,'field3':101}".replace('\'', '"').getBytes()); iter3Failure.read(testObject3Type); Assert.fail(); } catch (JsonException e) { System.out.println(e); } try { JsonIterator iter4Failure = JsonIterator.parse("{'field1':101,'field2':101,'field3':101}".replace('\'', '"').getBytes()); iter4Failure.read(testObject4Type); Assert.fail(); } catch (JsonException e) { System.out.println(e); } } public static void main(String[] args) throws Exception { Main.main(new String[]{ "FieldMatching", "-i", "5", "-wi", "5", "-f", "1", }); } @Benchmark public void iter0(Blackhole bh) throws IOException { iter0.reset(iter0Input); bh.consume(iter0.read(testObject0Type)); } @Benchmark public void iter1Success(Blackhole bh) throws IOException { iter1Success.reset(iter1SuccessInput); bh.consume(iter1Success.read(testObject1Type)); } }