Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将RequestBody json转换为对象-Spring引导_Java_Php_Json_Spring_Spring Boot - Fatal编程技术网

Java 将RequestBody json转换为对象-Spring引导

Java 将RequestBody json转换为对象-Spring引导,java,php,json,spring,spring-boot,Java,Php,Json,Spring,Spring Boot,我是java开发的初学者,但之前有过PHP和Python等编程语言的经验。所以,对于如何在spring boot上继续开发,很少有人感到困惑 我正在开发一个RESTAPI,它有以下要求 { "key":"value", "key1":"value1", "platform_settings":[ {"key":"value"} ] } 我所做的 我创建了一个RestController,它接受http请求并为资源创建了一个函数 public Share share(

我是java开发的初学者,但之前有过PHP和Python等编程语言的经验。所以,对于如何在spring boot上继续开发,很少有人感到困惑

我正在开发一个RESTAPI,它有以下要求

{
  "key":"value",
  "key1":"value1",
  "platform_settings":[
      {"key":"value"}
  ]
}
我所做的

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

public Share share(@RequestBody final Share share) { 
        LOGGER.debug("This is the request", share);
        return share; //
}
问题1:如果它是任何其他编程语言,比如PHP或Python,那么将有一个helper函数,它将接受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;
    }

}
实体
包com.payunow.socialsharemodule.models;
导入java.util.Map;
导入javax.persistence.Entity;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
@实体
公开股{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私钥;
私有字符串键1;
私人地图平台设置;
公共共享(字符串名称、字符串描述、地图平台设置){
this.key=key;
此参数为0.key1=key1;
this.platform\u settings=平台设置;
}
//JPA
公共共享(){}
公共字符串getKey(){
返回键;
}
公共字符串getKey1(){
返回键1;
}
公共地图getPlatform_设置(){
返回平台设置;
}
}

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

将json转换为java对象需要Jackson依赖性。但是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传递到此端点。

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

@Japu_D_Cret这不是重复的。请在评论之前阅读我的问题!有点像,我链接到的被接受的答案使用了
json simple
库,它不会强迫您为响应创建包装器,您可以处理像JSONArray和JSONObject这样的对象,然后相应地转换这些对象。但是如果您每次的响应都是相同的格式,我建议您创建一个包装器类Jackson@Japu_D_Cret如果您看到这个问题,我的问题是关于处理请求以及是否应该始终将请求映射到类。您的答案与J2ME应用程序中的用法有关,而不是与springboot应用程序有关链接错误的答案,请参阅,下面是如何使用JSON simple
转换JSON字符串我是否应该始终将请求映射到类
如果您希望从响应处理中获得最后一点性能,那么要么根本不解析JSON,要么使用JSON simple只解析所需的JSON。如果您想要可靠地处理响应并拥有一个强类型对象,这比我建议的更便于用户使用,那么您可以利用较小的时间差,将其完全转换为与Jackson等类似的POJO。如果您想像使用Python一样使用它,json简单库非常接近