【问题标题】:How to access fields of converted JSON object sent in POST body?如何访问在 POST 正文中发送的转换后的 JSON 对象的字段?
【发布时间】:2014-09-20 20:34:27
【问题描述】:

我的 Spring @Controller 需要访问 JSON 格式的传递对象的字段。我想避免构建许多类来映射每个请求响应。例如,我需要连接存储两个外键。它们作为{"key1": 1,"key2": 2} 传递给控制器​​。如果我没有具有 2 个字段来映射这些属性的对象,如何访问这些字段?如何设置 Spring 控制器方法?

我的代码:

@RequestMapping(value = "/addProductPart", method = RequestMethod.POST, consumes = "application/json")
    @ResponseBody
    public String addProductPart(Model model, @RequestBody Object json,
                                 BindingResult result){

        // access somehow key1 and of json Object

更新: 我知道我可以使用RequestMethod.GET 和@RequestParam 让它工作,但由于我修改数据我需要RequestMethod.POST 或RequestMethod.PUT。

已解决:

@RequestMapping(value = "/addProductPart", method = RequestMethod.PUT, consumes = "application/json")
    @ResponseBody
    public String addProductPart(Model model, @RequestBody Object   obj){
...
int p = (Integer)((Map)obj).get("part");
...
}

【问题讨论】:

    标签: java json spring rest spring-mvc


    【解决方案1】:

    Spring 默认使用 Jackson 来反序列化 JSON。如果您指定 Object 作为参数类型,Jackson 会将 JSON 反序列化为 LinkedHashMap。您可以通过Map#get(Object) 转换变量并访问元素。

    或者,您可以将您的方法参数声明为适合 JSON 结构的 POJO 类型,Jackson 将反序列化为该类型。然后,您可以使用它的 getter 来检索您的数据。

    【讨论】:

    • 您能否提供代码示例如何从Object 或将LinkedHashMap 转换为给定名称的元素?
    【解决方案2】:

    你可以这样做:

    @RequestMapping(value = "/addProductPart", method = RequestMethod.POST, consumes = "application/json")
    @ResponseBody
    public String addProductPart(@RequestBody GetData obj){
       System.out.println(obj.jObj.getString("key1"));
    }
    

    这里的GetData 是接收数据并在其中映射传入数据的类。

    GetData class:

    public class GetData{
      private JSONObject jObj;
    
      //getter-setter
    
      // if you are getting more than one element or array of json then :
    
      private JSONArray jArray();
      // getter-setter
    }
    

    如果你想要JSonArray,那么你可以对它进行操作。

    相关代码教程是Here。

    还有一些问题,然后发给我。

    您也可以在方法调用中直接使用JSonObject,但如果您获得更多数据,那么最好使用 Class 并将其传递给那里。

    请记住,收到的名称 JSonObject 和名称 declared in class 应该相同。

    有问题发帖给我。

    【讨论】:

    • 为什么我不能像@RequestBody (JSonObject)Object obj这样投射? IDE 也不行@RequestBody JSonObject obj。如何解决这个问题?
    • @RCola - 你试过@RequestBody JSonObject obj 吗?我认为它会起作用。如果是则从中读取数据,否则发给我。
    • 它需要一些我无法工作的额外依赖项。请参阅更新 - 我最终得到的解决方案。谢谢!
    • 你添加了Jackson的依赖吗?对于JSON serialize & deserialize。
    • 我正在使用org.codehaus.jackson 并且工作正常。
    猜你喜欢
    • 2023-01-09
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2021-10-14
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多