繁体   English   中英

如何接受动态JSON响应并将一个键值添加到该对象并从Spring Boot控制器返回相同的JSONObject

[英]How to accept dynamic json response and add one key-value to that object and return that same JSONObject from the spring boot controller

我的控制器正在接收POST请求作为dto对象,我的dto有一个Object数组,该数组用于获取json对象的数组,我必须向该数组中的每个json对象添加一个键值,然后将其返回。

dto类:

public class FileProcessDTO {

    private String module;
    private Object[] data;

    public String getModule() {
        return module;
    }
    public void setModule(String module) {
        this.module = module;
    }
    public Object[] getData() {
        return data;
    }
    public void setData(Object[] data) {
        this.data = data;
    }
}

下面是控制器方法

@PostMapping("/processData")
    public FileProcessDTO processFileData(@Valid @RequestBody FileProcessDTO fileProcess) throws JSONException {

        String module = fileProcess.getModule();
        Object[] objects= fileProcess.getData();

        JSONObject jsonObject = new JSONObject();
        JSONArray jsonArray = new JSONArray(fileProcess.getData());

        FileProcessDTO fileProcessDTO = new FileProcessDTO();
        fileProcessDTO.setModule(module);


        for (int i = 0; i < jsonArray.length(); i++) {
            try {
                jsonObject = jsonArray.getJSONObject(i);
                jsonObject.put("status", true);
            } catch (Exception e) {
                jsonObject.put("status", false);
                jsonObject.put("error", e.getMessage());
            }


            objects[i]=jsonObject;

        }
        fileProcessDTO.setData(objects);

        return fileProcessDTO;
    }

下面是客户端在请求后传递的数据

{
"module" : "assignment",
"data":[
    {
        "name": "chandan",
        "age":"27"
    },
    {
        "name": "Yo",
        "age":"26"
    },
    {
        "name": "Jo",
        "age":"25"
    }
]
}

在上述“数据”对象中,数组键和值在不同的请求中将有所不同(可能在下一个请求中, “名称”和“年龄”将发生变化)。

下面我得到错误。

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.boot.configurationprocessor.json.JSONObject]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.springframework.boot.configurationprocessor.json.JSONObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.crisil.apg.service.dto.FileProcessDTO["data"]->org.springframework.boot.configurationprocessor.json.JSONObject[0])
2019-04-17 12:04:14.002  WARN 10808 --- [nfoReplicator-0] c.n.discovery.InstanceInfoReplicator     : There was a problem with the instance info replicator

我还尝试如下更改控制器方法中的行,但是,它不作为json响应。

objects[i]=jsonObject.toString();

//below is response
{
    "module": "assignment",
    "data": [
        "{\"name\":\"chandan\",\"age\":\"27\",\"status\":true}",
        "{\"name\":\"Yo\",\"age\":\"26\",\"status\":true}",
        "{\"name\":\"Jo\",\"age\":\"25\",\"status\":true}"
    ]
}

请提出可能的代码以使其工作。谢谢。

您可以将String用作请求正文,然后将字符串转换为JSONObject并进行处理。

@PostMapping(value="/get",consumes={"application/json"})
    public ResponseEntity<?> test(@RequestBody String req){

        //String to JSON Object
        JSONObject obj= new JSONObject(req);
        JSONArray arr=(JSONArray)obj.get("arr");

        //Adding ID to JSON ARRAY
        for(int i=0;i<arr.length();i++){
            JSONObject ob=(JSONObject)arr.get(i);
            ob.append("id", "id-"+i+1);
            arr.put(i, ob);
        }
        return new ResponseEntity<>(arr.toString(),HttpStatus.OK);
    }

我尝试使用上面提到的输入来重新创建上述问题,但没有遇到任何错误,我对邮递员的回答如下:

{
"module": "assignment",
"data": [
    {
        "empty": false
    },
    {
        "empty": false
    },
    {
        "empty": false
    }
]

}

登录我的控制台:

2019-04-17 13:24:30.128 DEBUG IND-PBHUITE
            --- [nio-8081-exec-3] o.s.w.s.DispatcherServlet                : POST "/processData/", parameters={}
2019-04-17 13:24:30.129 DEBUG IND-PBHUITE
            --- [nio-8081-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to public com.noobcompany.metrostation.model.FileProcessDTO com.noobcompany.metrostation.controller.MainController.processFileData(com.noobcompany.metrostation.model.FileProcessDTO)
2019-04-17 13:24:30.130 DEBUG IND-PBHUITE
            --- [nio-8081-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [com.noobcompany.metrostation.model.FileProcessDTO@36c525]
2019-04-17 13:24:30.130 DEBUG IND-PBHUITE
            --- [nio-8081-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json]
2019-04-17 13:24:30.131 DEBUG IND-PBHUITE
            --- [nio-8081-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Writing [com.noobcompany.metrostation.model.FileProcessDTO@f12f53]
2019-04-17 13:24:30.132 DEBUG IND-PBHUITE
            --- [nio-8081-exec-3] o.s.w.s.DispatcherServlet                : Completed 200 OK

我正在将SpringBoot 2.1.4.RELEASE与RestController一起使用,并对JsonObject使用以下依赖项

        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180813</version>
        </dependency>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM