On Tue, Sep 19, 2023 at 7:19 AM Aditya Pant <aditya.ja...@gmail.com> wrote:
>
> I have removed all lombok annotations from Person and Address classes. Then 
> added getters and setters.
>
> As earlier it reached to JsonPointerPropertyIntrospector and created 
> instance, however it didn't invoke 
> JsonPointerPropertyDeserializer.deserialize(). Similar behavior with 
> ContextualDeserilizer.

It seems very odd that an instance was created but not used.

Could you file an issue for jackson-databind Github project, including
a minimal reproduction of method not getting called -- it's ok if code
wouldn't do quite what it supposed to as long as it's clear method is
not called.

>
> Another challenge, in the input json "requestModel" contains mixed data 
> (address, product, person). During deserialization they need to be set on 
> individual member (objects) on a person object. @JsonProperty("requestModel") 
> only works for one field. Adding it to address and product not allowed it 
> seems. "Conflicting getter definitions for property 'requestModel' "

I'd need to see full class definition for this to make sure I
understand the issue.

You can add that to the issue filed.

-+ Tatu +-

>
> I hope there is a way to combine JsonPath and Jackson behavior
>
> On Tuesday, September 19, 2023 at 11:12:55 PM UTC+10 Aditya Pant wrote:
>>
>> Thank you Tatu for your insights. Appreciate it.
>> You are right it could be annotations are not copied during annotation 
>> processing.
>> Definitely I will give it a try without lombok annotations.
>>
>>
>>
>> On Tuesday, September 19, 2023 at 2:27:49 PM UTC+10 Tatu Saloranta wrote:
>>>
>>> On Sun, Sep 17, 2023 at 9:39 PM Aditya Pant <aditya...@gmail.com> wrote:
>>> >
>>> > Hello Jackson community,
>>> >
>>> > The input Json have nested fields and different field names. I am looking 
>>> > for a way to deserilize using JsonPointer espression (because it allows 
>>> > path lookup).
>>> >
>>> > I have tried several approaches but none of them worked so far.
>>> >
>>> > - Tried using AnnotationIntrospector = introspector gets invoked which 
>>> > returns a custom deserializer from overridden findDeserializer(). 
>>> > However, custom JsonDeserialiser.deserialize() never invoked on 
>>> > mapper.readValue()
>>> >
>>> > - Tried using ContextualDeserilizer = it gets invoked which returns a 
>>> > custom deserializer. However, custom JsonDeserialiser.deserialize() never 
>>> > invoked on mapper.readValue()
>>>
>>> Those both should work. I didn't see anything obviously wrong in your
>>> code, but there are 2 things that might be problematic: I'll add notes
>>> below.
>>>
>>> >
>>> > The customer deserialiser only invoked when it is declared on the class 
>>> > (not on field).
>>> >> Following are classes:
>>> > Using jackson with lombok
>>>
>>> This might be problematic -- possibly annotations might not be copied
>>> into generated classes?
>>> Either way, trying things out with regular POJO could rule out Lombok
>>> as being problematic
>>> (Jackson should work just fine with Lombok but there have been some
>>> issues in the past)
>>>
>>> >
>>> > // custom annotation
>>> >
>>> > @Target({ElementType.FIELD})
>>> > @Retention(RetentionPolicy.RUNTIME)
>>> > @Documented
>>> > public @interface JsonPointerProperty {
>>> >
>>> > String value();
>>> > }
>>> >
>>> > // Person POJO
>>> >
>>> > @Data
>>>
>>>
>>> > @NoArgsConstructor
>>> > @AllArgsConstructor
>>> > @JsonIgnoreProperties(ignoreUnknown = true)
>>>
>>> ^^^ I always recommend removing this annotation when troubleshooting,
>>> it can easily mask problems.
>>>
>>> > public class Person {
>>> > private String name;
>>> > private Address address;
>>> > }
>>> >
>>> > // Address POJO
>>> >
>>> > @Data
>>> > @NoArgsConstructor
>>> > @AllArgsConstructor
>>> > @JsonIgnoreProperties(ignoreUnknown = true)
>>> > public class Address {
>>> >
>>> > // using custom annotation
>>> > @JsonPointerProperty("/requestModel/streetName")
>>> > private String street;
>>> > private String city;
>>> > private String postcode;
>>> > }
>>> >
>>> > // introspector
>>> >
>>> > public class JsonPointerPropertyIntrospector
>>> > extends NopAnnotationIntrospector {
>>> >
>>> > @Override
>>> > public Object findDeserializer(Annotated am) {
>>> >
>>> > final JsonPointerProperty jsonPointerProperty = 
>>> > am.getAnnotation(JsonPointerProperty.class);
>>> > if (jsonPointerProperty != null) {
>>> > return new JsonPointerPropertyDeserializer(
>>> > jsonPointerProperty.value(),
>>> > am.getType().getRawClass()
>>> > );
>>> > }
>>> >
>>> > return super.findDeserializer(am);
>>> > }
>>> > }
>>> >
>>> > // custom deserializer
>>> > public class JsonPointerPropertyDeserializer
>>> > extends JsonDeserializer<Object> {
>>> >
>>> > private final String jsonPath;
>>> > private final Class<?> clazz;
>>> >
>>> > public JsonPointerPropertyDeserializer() {
>>> > this(null, null);
>>> > }
>>> >
>>> > public JsonPointerPropertyDeserializer(String jsonPath,
>>> > Class<?> clazz) {
>>> > this.jsonPath = jsonPath;
>>> > this.clazz = clazz;
>>> > }
>>> >
>>> > @Override
>>> > public Object deserialize(JsonParser parser, DeserializationContext ctx)
>>> > throws IOException, JacksonException {
>>> >
>>> > // not reaching here
>>> > JsonNode jsonNode = parser.readValueAs(JsonNode.class);
>>> > JsonNode at = jsonNode.at(jsonPath);
>>> >
>>> > String value = ctx.readTreeAsValue(jsonNode, String.class);
>>> >
>>> > System.out.println(value);
>>> >
>>> > return null;
>>> > }
>>> > }
>>> >
>>> >
>>> > // Unit test
>>> >
>>> > class PersonTest {
>>> > String json;
>>> >
>>> > @BeforeEach
>>> > void setup() throws IOException {
>>> > json = "{ 'address': { 'requestModel': { 'streetName': 'some street', 
>>> > 'cityName': 'some city' }}}"
>>> > .replace(
>>> > "'",
>>> > "\""
>>> > );
>>> > }
>>> >
>>> > @Test
>>> > void testPerson() throws JsonProcessingException {
>>> > ObjectMapper mapper = new ObjectMapper();
>>> > mapper.setAnnotationIntrospector(new JsonPointerPropertyIntrospector());
>>> >
>>> > final Person person = mapper.readValue(json, Person.class);
>>> >
>>> > assertEquals("some street", person.getAddress().getStreet(), "Street 
>>> > mismatch");
>>> > }
>>> > }
>>> >
>>> > There is some error parsing `requestModel`, but I was hoping it would at 
>>> > least reach to customer deserializer.
>>> >
>>> > Any suggestions or point me what I am doing wrong?
>>>
>>> I suspect Lombok might be relevant here; annotations not being copied
>>> into generated classes.
>>>
>>> -+ Tatu +-
>
> --
> You received this message because you are subscribed to the Google Groups 
> "jackson-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to jackson-user+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/jackson-user/95fcf79f-c137-490b-acff-09ed68494b12n%40googlegroups.com.

-- 
You received this message because you are subscribed to the Google Groups 
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jackson-user+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jackson-user/CAL4a10jHYDGAsFwMqmezdxB6jgYGR3SJHztr%3DpT8N2%2BD1icLUQ%40mail.gmail.com.

Reply via email to