Hello Tatu, I found this *post* <https://stackoverflow.com/questions/37010891/how-to-map-a-nested-value-to-a-property-using-jackson-annotations> on *stackoverflow *which matches the exact scenario I was trying to explain you. It says: The actual JSON response I'm trying to parse is very complex, and I don't want to have to create an entire new class for every sub-node, even though I only need a single field. This page led me to a library called *Elastic Path's JSON Unmarshaller* <https://github.com/elasticpath/json-unmarshaller> . It will solve my problem, but just wanted to make sure with you if this library is stable and recommended? Please comment on this.
Thanks a lot..! On Monday, September 11, 2017 at 12:55:28 AM UTC+5:30, chetan choulwar wrote: > > You can consider my API as a proxy for connecting to different APIs > providing similar kinda data represented in somewhat different way than > each other. > > On Sunday, September 10, 2017 at 10:00:21 PM UTC+5:30, Tatu Saloranta > wrote: >> >> On Sat, Sep 9, 2017 at 9:58 PM, chetan choulwar <[email protected]> >> wrote: >> > That @JsonAlias worked fine. But my problem is with nested elements, >> how can >> > I specify nested json element into alias? >> >> You can't. If your structures differ beond just naming you need to do >> something else. >> Databinding is meant to match incoming document structure to a Java >> object graph and vice versa. >> It is not designed to allow arbitrary transformation, or unification >> of differing structures into single model. >> >> It is possible to unify differing structures, of course, but that is >> true transformation and something explicitly >> out of scope for Jackson. You can use `JsonNode` as structure modify, >> for input and output structures, and it is possible >> to change structure any way you want. But you have to write that >> transformation yourself. >> Or you can use separate Java classes for input(s) and output. >> >> > And reason for doing so is that I'm writing an API that will send the >> common >> > response out of all these different APIs I am calling from my API. >> >> I am still not sure I fully understand your usage, still; this is very >> generic explanation. >> >> But assuming I do understand... if input data you get from a service >> differs, you should consider separating handling of your input from >> constructing your output. Do not try to use same set of objects if >> structures are not same or similar enough. Trying to do that is false >> savings and tends to sacrifice clean design for seeming savings. >> >> This assuming I actually understood what you are trying to do -- >> without full explanation of steps from calling another service to >> formulating output it is possible to misunderstand intent. >> >> > Apart from this it'd be great if you can you mail me a link where I can >> find >> > latest documentation and hands-on for the same. >> > >> > Thanking you in anticipation..! >> >> Documentation hub is at: >> >> https://github.com/FasterXML/jackson-docs >> >> and main portal >> >> https://github.com/FasterXML/jackson/ >> >> has some links. >> >> -+ Tatu +- >> >> >> >> > >> > >> > On Sunday, September 10, 2017 at 9:21:55 AM UTC+5:30, Tatu Saloranta >> wrote: >> >> >> >> On Fri, Sep 8, 2017 at 5:13 AM, chetan choulwar <[email protected]> >> >> wrote: >> >> > Thanks a lot for your input. I tried it and it worked as expected. >> But >> >> > I'm >> >> > stuck at a situation where I want to retrieve a value from nested >> block, >> >> > so >> >> > can you help me out? >> >> > For example, >> >> > By calling REST API "https://xyz.com/resources/resource" gives me { >> >> > >> >> > "value"={"name":"abc.txt"} >> >> > >> >> > } >> >> > and calling "https://abc.com/resources/resource" gives me >> >> > {"title":"idontknow.txt"} >> >> > now how can I take name out from the first json response? >> >> > >> >> > Once again thanks a lot for your answer..!:) >> >> >> >> I am not sure why my first answer wouldn't work here. All you are >> >> doing is specifying that property name in json is an alias that can be >> >> used for property in POJO, so you would access it with field name (or >> >> getter) you have. >> >> >> >> But at the same time if these are effectively different objects it is >> >> unclear why same Java class should be used anyway -- perhaps they >> >> should use different POJOs. >> >> >> >> -+ Tatu +- >> >> >> >> >> >> > >> >> > On Friday, September 8, 2017 at 9:19:49 AM UTC+5:30, Tatu Saloranta >> >> > wrote: >> >> >> >> >> >> On Thu, Sep 7, 2017 at 5:24 AM, chetan choulwar <[email protected]> >> >> >> >> wrote: >> >> >> > Hi All, >> >> >> > >> >> >> > I'm calling different REST APIs and getting different kinda JSON >> >> >> > responses; >> >> >> > is there any way to pick particular attribute from different JSON >> >> >> > responses >> >> >> > and map it to a one common property of defined POJO (Resource for >> my >> >> >> > API) >> >> >> > that can then be sent as a response from the REST API that I've >> >> >> > exposed? >> >> >> > >> >> >> > For Example: >> >> >> > By calling REST API "https://xyz.com/resources/resource" gives >> me >> >> >> > {"name":"abc.txt"} >> >> >> > and calling "https://abc.com/resources/resource" gives me >> >> >> > {"title":"idontknow.txt"} >> >> >> > >> >> >> > And I have one resource class defined for my APIs to return i.e. >> >> >> > MyResource >> >> >> > { >> >> >> > String fileName; >> >> >> > } >> >> >> > >> >> >> > So is there any way that I can map "name"/"title" to fileName >> i.e. >> >> >> > how >> >> >> > can I >> >> >> > use jackson to deserialize these jsons to MyResource type? >> >> >> > >> >> >> > Please let me know if this is valid? and if yes, how? >> >> >> >> >> >> If you have many different names to use, it may be simpler to just >> >> >> bind JSON to `Map` or `JsonNode`, and extract value explicitly. >> >> >> >> >> >> But if there are just couple of values, you can use `@JsonAlias` >> like: >> >> >> >> >> >> public class POJO { >> >> >> @JsonAlias({ "name", "title" }) >> >> >> public String fileName; >> >> >> } >> >> >> >> >> >> which would then accept alternate names "name" and "title", but >> >> >> serialize as "fileName" (which it also accepts). >> >> >> This annotations was added in Jackson 2.9 >> >> >> >> >> >> -+ Tatu +- >> >> > >> >> > -- >> >> > You received this message because you are subscribed to the Google >> >> > Groups >> >> > "jackson-dev" group. >> >> > To unsubscribe from this group and stop receiving emails from it, >> send >> >> > an >> >> > email to [email protected]. >> >> > For more options, visit https://groups.google.com/d/optout. >> > >> > -- >> > You received this message because you are subscribed to the Google >> Groups >> > "jackson-dev" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> an >> > email to [email protected]. >> > For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "jackson-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
