package com.fasterxml.jackson.databind.struct; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.BaseMapTest; import com.fasterxml.jackson.databind.ObjectMapper; public class TestPOJOAsArrayAdvanced extends BaseMapTest { @JsonFormat(shape=JsonFormat.Shape.ARRAY) @JsonPropertyOrder(alphabetic=true) static class CreatorAsArray { protected int x, y; public int a, b; @JsonCreator public CreatorAsArray(@JsonProperty("x") int x, @JsonProperty("y") int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } @JsonFormat(shape=JsonFormat.Shape.ARRAY) @JsonPropertyOrder({"a","b","x","y"}) static class CreatorAsArrayShuffled { protected int x, y; public int a, b; @JsonCreator public CreatorAsArrayShuffled(@JsonProperty("x") int x, @JsonProperty("y") int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } static class ViewA { } static class ViewB { } @JsonFormat(shape=JsonFormat.Shape.ARRAY) @JsonPropertyOrder(alphabetic=true) static class AsArrayWithView { @JsonView(ViewA.class) public int a; @JsonView(ViewB.class) public int b; public int c; } @JsonFormat(shape=JsonFormat.Shape.ARRAY) @JsonPropertyOrder(alphabetic=true) static class AsArrayWithViewAndCreator { @JsonView(ViewA.class) public int a; @JsonView(ViewB.class) public int b; public int c; @JsonCreator public AsArrayWithViewAndCreator(@JsonProperty("a") int a, @JsonProperty("b") int b, @JsonProperty("c") int c) { this.a = a; this.b = b; this.c = c; } } /* /***************************************************** /* Basic tests /***************************************************** */ private final static ObjectMapper MAPPER = new ObjectMapper(); public void testWithView() throws Exception { // Ok, first, ensure that serializer will "black out" filtered properties AsArrayWithView input = new AsArrayWithView(); input.a = 1; input.b = 2; input.c = 3; String json = MAPPER.writerWithView(ViewA.class).writeValueAsString(input); assertEquals("[1,null,3]", json); // and then that conversely deserializer does something similar AsArrayWithView result = MAPPER.readerFor(AsArrayWithView.class).withView(ViewB.class) .readValue("[1,2,3]"); // should include 'c' (not view-able) and 'b' (include in ViewB) but not 'a' assertEquals(3, result.c); assertEquals(2, result.b); assertEquals(0, result.a); } public void testWithViewAndCreator() throws Exception { AsArrayWithViewAndCreator result = MAPPER.readerFor(AsArrayWithViewAndCreator.class) .withView(ViewB.class) .readValue("[1,2,3]"); // should include 'c' (not view-able) and 'b' (include in ViewB) but not 'a' assertEquals(3, result.c); assertEquals(2, result.b); assertEquals(0, result.a); } public void testWithCreatorsOrdered() throws Exception { CreatorAsArray input = new CreatorAsArray(3, 4); input.a = 1; input.b = 2; // note: Creator properties get sorted ahead of others, hence not [1,2,3,4] but: String json = MAPPER.writeValueAsString(input); assertEquals("[3,4,1,2]", json); // and should get back in proper order, too CreatorAsArray output = MAPPER.readValue(json, CreatorAsArray.class); assertEquals(1, output.a); assertEquals(2, output.b); assertEquals(3, output.x); assertEquals(4, output.y); } // Same as above, but ordering of properties different... public void testWithCreatorsShuffled() throws Exception { CreatorAsArrayShuffled input = new CreatorAsArrayShuffled(3, 4); input.a = 1; input.b = 2; // note: explicit ordering overrides implicit creators-first ordering: String json = MAPPER.writeValueAsString(input); assertEquals("[1,2,3,4]", json); // and should get back in proper order, too CreatorAsArrayShuffled output = MAPPER.readValue(json, CreatorAsArrayShuffled.class); assertEquals(1, output.a); assertEquals(2, output.b); assertEquals(3, output.x); assertEquals(4, output.y); } }