package com.jsoniter; import com.jsoniter.annotation.*; import com.jsoniter.any.Any; import com.jsoniter.fuzzy.StringIntDecoder; import com.jsoniter.spi.JsonException; import com.jsoniter.spi.JsoniterSpi; import junit.framework.TestCase; import java.io.IOException; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; public class TestAnnotation extends TestCase { static { JsoniterAnnotationSupport.enable(); // JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_WITH_HASH); // JsonIterator.setMode(DecodingMode.REFLECTION_MODE); } public static class TestObject1 { @JsonProperty(from = {"field-1"}) public int field1; @JsonIgnore public int field2; } public void test_rename() throws IOException { JsonIterator iter = JsonIterator.parse("{'field-1': 100}".replace('\'', '"')); TestObject1 obj = iter.read(TestObject1.class); assertEquals(100, obj.field1); } public void test_ignore() throws IOException { JsonIterator iter = JsonIterator.parse("{'field2': 100}".replace('\'', '"')); TestObject1 obj = iter.read(TestObject1.class); assertEquals(0, obj.field2); } public static class TestObject2 { private int field1; @JsonCreator public TestObject2(@JsonProperty("field1") int field1) { this.field1 = field1; } } public void test_ctor() throws IOException { JsonIterator iter = JsonIterator.parse("{'field1': 100}".replace('\'', '"')); TestObject2 obj = iter.read(TestObject2.class); assertEquals(100, obj.field1); } public static class TestObject3 { public int field1; @JsonCreator private TestObject3() { } } public void test_private_ctor() throws IOException { JsoniterSpi.registerTypeDecoder(TestObject3.class, ReflectionDecoderFactory.create(TestObject3.class)); JsonIterator iter = JsonIterator.parse("{'field1': 100}".replace('\'', '"')); TestObject3 obj = iter.read(TestObject3.class); assertEquals(100, obj.field1); } public static class TestObject4 { private int field1; private TestObject4() { } @JsonCreator public static TestObject4 createObject(@JsonProperty(value = "field1") int field1) { TestObject4 obj = new TestObject4(); obj.field1 = field1; return obj; } } public void test_static_factory() throws IOException { JsonIterator iter = JsonIterator.parse("{'field1': 100}".replace('\'', '"')); TestObject4 obj = iter.read(TestObject4.class); assertEquals(100, obj.field1); } public static class TestObject5 { private int field1; public void setField1(int field1) { this.field1 = field1; } } public void test_single_param_setter() throws IOException { JsonIterator iter = JsonIterator.parse("{'field1': 100}".replace('\'', '"')); TestObject5 obj = iter.read(TestObject5.class); assertEquals(100, obj.field1); } public static class TestObject6 { private int field1; @JsonWrapper public void initialize(@JsonProperty("field1") int field1) { this.field1 = field1; } } public void test_multi_param_setter() throws IOException { JsonIterator iter = JsonIterator.parse("{'field1': 100}".replace('\'', '"')); TestObject6 obj = iter.read(TestObject6.class); assertEquals(100, obj.field1); } public static class TestObject7 { @JsonProperty(required = true) public int field1; @JsonMissingProperties public List<String> missingProperties; } public void test_required_properties() throws IOException { JsonIterator iter = JsonIterator.parse("{}"); TestObject7 obj = iter.read(TestObject7.class); assertEquals(Arrays.asList("field1"), obj.missingProperties); } public static class TestObject8 { @JsonCreator public TestObject8(@JsonProperty(required = true) int param1) { } } public void test_missing_ctor_arg() throws IOException { JsonIterator iter = JsonIterator.parse("{}"); try { iter.read(TestObject8.class); fail(); } catch (JsonException e) { System.out.println(e); } } @JsonObject(asExtraForUnknownProperties = true) public static class TestObject9 { @JsonExtraProperties public Map<String, Any> extraProperties; } public void test_extra_properties() throws IOException { JsonIterator iter = JsonIterator.parse("{\"field1\": 100}"); TestObject9 obj = iter.read(TestObject9.class); assertEquals(100, obj.extraProperties.get("field1").toInt()); } public static class TestObject10 { @JsonProperty(decoder = StringIntDecoder.class) public int field1; } public void test_property_decoder() throws IOException { JsonIterator iter = JsonIterator.parse("{\"field1\": \"100\"}"); TestObject10 obj = iter.read(TestObject10.class); assertEquals(100, obj.field1); } public static class TestObject11 { @JsonProperty(decoder = StringIntDecoder.class) public Integer field1; } public void test_integer_property_decoder() throws IOException { JsonIterator iter = JsonIterator.parse("{\"field1\": \"100\"}"); TestObject11 obj = iter.read(TestObject11.class); assertEquals(Integer.valueOf(100), obj.field1); } public static class TestObject12 { @JsonProperty(from = {"field_1", "field-1"}) public int field1; } public void test_bind_from_multiple_names() throws IOException { JsonIterator iter = JsonIterator.parse("{\"field-1\": 100, \"field-1\": 101}"); TestObject12 obj = iter.read(TestObject12.class); assertEquals(101, obj.field1); } @JsonObject(asExtraForUnknownProperties = true) public static class TestObject13 { } public void test_unknown_properties() throws IOException { JsonIterator iter = JsonIterator.parse("{\"field-1\": 100, \"field-1\": 101}"); try { iter.read(TestObject13.class); fail(); } catch (JsonException e) { System.out.println(e); } } public static class TestObject14 { @JsonProperty(required = true) public int field1; @JsonMissingProperties public List<String> missingProperties; } public void test_required_properties_not_missing() throws IOException { JsonIterator iter = JsonIterator.parse("{\"field1\": 100}"); TestObject14 obj = iter.read(TestObject14.class); assertNull(obj.missingProperties); assertEquals(100, obj.field1); } @JsonObject(unknownPropertiesBlacklist = {"field1"}) public static class TestObject15 { } public void test_unknown_properties_blacklist() throws IOException { JsonIterator iter = JsonIterator.parse("{\"field1\": 100}"); try { iter.read(TestObject15.class); fail(); } catch (JsonException e) { System.out.println(e); } } public static class TestObject16 { @JsonProperty(implementation = LinkedList.class) public List<Integer> values; } public void test_specify_property() throws IOException { JsonIterator iter = JsonIterator.parse("{\"values\": [100]}"); TestObject16 obj = iter.read(TestObject16.class); assertEquals(Arrays.asList(100), obj.values); assertEquals(LinkedList.class, obj.values.getClass()); } public static class TestObject17 { public int field1; public void setField1(int field1) { this.field1 = field1; } @JsonCreator public void initialize(@JsonProperty("field1") int field1) { } } public void test_name_conflict() throws IOException { JsonIterator iter = JsonIterator.parse("{}"); assertNotNull(iter.read(TestObject17.class)); } }