On Fri, Sep 22, 2017 at 4:31 AM, chetan choulwar <[email protected]> wrote: > Do we have anything like @XMlPath in jackson?
I don't know what exactly @XMLPath does, but if it is something for referencing to sub-trees, no. @JsonUnwrapped is the only annotation that does something similar. -+ Tatu +- > > > On Tuesday, September 12, 2017 at 3:58:58 PM UTC+5:30, chetan choulwar > wrote: >> >> This actually sounds good to have one POJO defined for each of the input >> JSON that is being dealt and that's what the way I was thinking but was not >> able to map nested json elements to shallow (class level) pojo properties(To >> avoid multiple POJOs for nested json objects). Well now that I've this >> elastic library at hand I can have one POJO defined for each input json and >> can use polymorphic deserialization then. >> >> Thanks a lot for your inputs Tatu..!:) >> >> On Tuesday, September 12, 2017 at 4:03:34 AM UTC+5:30, Tatu Saloranta >> wrote: >>> >>> On Sun, Sep 10, 2017 at 12:19 PM, chetan choulwar <[email protected]> >>> wrote: >>> > Okay..Let me help you with one real time example. Consider for an >>> > example >>> > different tv channels have exposed their APIs to get list of programs >>> > telecast-ed on them. And now suppose I'm trying to expose one APIs that >>> > will >>> > accept channel name and provide the list of programs for that >>> > particular >>> > channel by calling it from my API and converting the response received >>> > in my >>> > own format (a common one). The kind of data I'm getting from different >>> > APIs >>> > is same but their representation is somewhat different, and what I want >>> > to >>> > do is to convert these responses into a common format defined by my API >>> > and >>> > send it as a response from my API. >>> > So now that I'm sure that I'm dealing with same kinda data represented >>> > somewhat different, is it okay to convert it into common format? >>> >>> Yes, but I don't think you should try to use just one single Java >>> class for all of that. >>> >>> It makes sense to use one class for representing output to your users, >>> but I think that if input structures, names vary, >>> then POJOs to map them to should be different too. You may reuse some >>> of those for "similar enough" inputs, >>> but there are limits to how far this helps. >>> I mean, you will always have to do some work anyway when adopting new >>> inputs -- even if just adding annotations. >>> So question there becomes: what approaches is easiest, most reliable >>> to maintain? >>> >>> > Currently I'm doing this by mapping each of the responses to JsonNode >>> > only, >>> > but every time I add a new common API I need to write different logic >>> > to >>> > convert the new response into a common one and that to for different >>> > APIs >>> > I'm calling from my API. >>> > If any kinda JSON response can be mapped to JsonNode, isn't is possible >>> > to >>> > map these different responses to any particular format? I mean can I >>> > write >>> > my resource object in such a way that I'd be able to map these >>> > different >>> > json responses representing same kinda data to my own resource, in some >>> > way, >>> > instead of doing manually by traversing through json tree? >>> > >>> > Hope it is clear to now..Initially I thought it's impossible, but you >>> > gave >>> > me direction and I do believe now there'd be some way that I can bind >>> > these >>> > different resources to common one. May be the way json objects are >>> > mapped to >>> > JsonNode. >>> > >>> > Please let me know if this is clear to you, as right now you the only >>> > hope I >>> > can see.! >>> > >>> > Thank you Tatu..! >>> >>> It may make sense to map input you get into `JsonNode` and have >>> separate code to traverse them; >>> or to have a set of Input POJOs and code to convert from those to >>> result/output POJO. >>> There are pros and cons to each approach. >>> >>> -+ Tatu +- >>> >>> > >>> > 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. > > -- > 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.
