MappingJacksonJsonView return top-level json object

后端 未结 3 1530
粉色の甜心
粉色の甜心 2021-01-03 02:23

I converted to controller to use ContentNegotiatingViewResolver instead of MessageConverters to support multiple output types. With json, I am using MappingJacksonJsonView:

相关标签:
3条回答
  • 2021-01-03 02:59

    What's happening is Spring MVC is taking the ModelAndView and serializing it to JSON. Since a ModelAndView just looks like a map, and in this case, you only have one entry in the map with a key name of myObject, that's what the JSON response looks at. In order to get just your object, you need to return just your object instead of a ModelAndView and let Jackson serialize your object to JSON.

    Rather than returning a ModelAndView, return a MyObject and annotate the method with @ResponseBody, so your controller method becomes

    @RequestMapping(value="/id/{id}", method=RequestMethod.GET, produces="application/json")
    public @ResponeBody MyObject getById(@PathVariable (value="id") String id) {
        return doGetById(id);
    }
    
    0 讨论(0)
  • 2021-01-03 03:03

    I faced same issue and following solution works for me.

    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
       <property name="prefixJson" value="true" />
    </bean>
    
    0 讨论(0)
  • 2021-01-03 03:03

    You should be able to remove the outer node by using MappingJacksonJsonView.setExtractValueFromSingleKeyModel(true):

    Set whether to serialize models containing a single attribute as a map or whether to extract the single value from the model and serialize it directly.

    The effect of setting this flag is similar to using MappingJacksonHttpMessageConverter with an @ResponseBody request-handling method.

    For example:

    private final MappingJacksonJsonView view = new MappingJacksonJsonView();
    
    public MyController() {
         view.setExtractValueFromSingleKeyModel(true);
    }
    
    @RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
    public ModelAndView getById(@PathVariable (value="id") String id) {
        MyObject ret = doGetById(id);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setView(this.view);
        modelAndView.addObject("myObject", ret);
        return modelAndView;
    }
    

    This should also work if you prefer to do it via configuration:

    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
        <property name="extractValueFromSingleKeyModel" value="true" />
    </bean>
    
    0 讨论(0)
提交回复
热议问题