将 RequestBody json 转换为对象 - Spring Boot

Posted

技术标签:

【中文标题】将 RequestBody json 转换为对象 - Spring Boot【英文标题】:Converting a RequestBody json to an Object - Spring Boot 【发布时间】:2017-08-23 21:41:20 【问题描述】:

我是 Java 开发的初学者,但之前有 php 和 Python 等编程语言的经验。对于如何在 Spring Boot 上进行开发,几乎没有什么困惑。

我正在开发一个具有以下请求的 REST API


  "key":"value",
  "key1":"value1",
  "platform_settings":[
      "key":"value"
  ]

我做了什么

我创建了一个接受 http 请求的 RestController 并为资源创建了一个函数

public Share share(@RequestBody final Share share)  
        LOGGER.debug("This is the request", share);
        return share; //

问题 1:如果是 PHP 或 Python 等其他编程语言,会有辅助函数接受 json 请求并将其转换为我可以轻松处理的对象。

在python中它就像

一样简单
import json
import requests

response = requests.get(...)
json_data = json.loads(response.text)
//can work on json_data anyway I want.

但是在 java 中,我必须创建一个 POJO 类,或者将 jackson/JPA 实体作为依赖项,它将请求映射到一个类(我应该用请求预先定义)。

有没有更好的方法可以做到这一点?对于我提出的每个请求,我都必须创建一个可以将请求映射到的类,并且我必须定义类

Entity

package com.payunow.socialsharemodule.models;

import java.util.Map;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;


import javax.persistence.Id;


@Entity
public class Share 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String key;
    private String key1;
    private Map<String,String> platform_settings;

    public Share(String name, String description,Map<String,String> platform_settings) 
        this.key = key;
        this.key1 = key1;
        this.platform_settings = platform_settings;
    

    //for JPA
    public Share() 

    public String getKey() 
        return key;
    

    public String getKey1() 
        return key1;
    

    public Map<String,String> getPlatform_settings() 
        return platform_settings;
    


对于我提出的每个请求,我都必须创建一个类来定义其内部的所有变量。这是唯一的方法吗?

【问题讨论】:

@Japu_D_Cret 这不是重复的。请在发表评论之前阅读我的问题! 它有点是,我链接到的接受的答案使用 json-simple 库,它不会强制您为响应创建包装器,您可以处理 JSONArray 和 JSONObject 等对象,然后相应地转换这些对象。但是,如果您的响应每次都是相同的格式,我建议创建一个包装器类一个 Jackson @Japu_D_Cret 如果您看到这个问题,我的问题是关于处理请求以及我是否应该始终将请求映射到一个类。您的回答与在 J2ME 应用程序中的使用有关,而不是在 springboot 应用程序中 链接了错误的答案,请参阅***.com/questions/1688099/converting-json-to-java,这是使用 json-simple ***.com/questions/30757136/… 转换 JSON 字符串的方法 whether should I always map request to a class or not 如果您想从响应处理中获得最后的性能,那么要么根本不解析 json,要么只使用 json-simple 尽可能多地解析它。如果您想在响应上可靠地工作并拥有一个强类型的对象,这比我建议您花一点时间赤字并将其完全转换为杰克逊等的 POJO 更易于使用。如果你想像使用 Python 一样使用它,json-simple 库非常接近 【参考方案1】:

您需要 Jackson 依赖才能将 json 转换为 java 对象。但是spring默认提供了,所以不用显式添加。

您不需要 JPA 实体。仅当您要将接收到的数据存储到数据库中时才需要这样做。 只需接收请求,您就不必创建单独的 pojo 类。看这段代码

@PostMapping("/json")
public JSONObject getGeneric(@RequestBody String stringToParse)
        JSONParser parser = new JSONParser();
        JSONObject json = null;
        try 
            json = (JSONObject) parser.parse(stringToParse);
         catch (ParseException e) 
            e.printStackTrace();
        
    return json;
   

正如您在此处看到的,它将字符串作为请求并将其转换为通用 JSONObject。所以基本上你可以将任何 json 传递给这个端点。

【讨论】:

【参考方案2】:

您可以使用 ObjectMapper 类,它具有 convertValue 和 realValue 等方法。

【讨论】:

以上是关于将 RequestBody json 转换为对象 - Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

@RequestBody 没有将 JSON 映射到 Java 对象 - Spring Boot

JSON处理(一):HTTP请求响应的JSON化 @RequestBody 和 @ResponseBody

将@RequestBody 转换为对象

@RequestBody, @ResponseBody 注解理解

@RequestBody和@ResponseBody的用法

springmvc的json数据交互