【问题标题】:Micronaut JSON post strip the QuotesMicronaut JSON 帖子删除引号
【发布时间】:2019-01-02 01:09:56
【问题描述】:

在 Micronaut 控制器中使用 JSON 对象解析发布请求。我希望它不包含引号,但它会在数据库插入中引用。

这样发帖:

curl -X POST --header "Content-Type: application/json" -d '{"bookid":3,"name":"C++"}'  http://localhost:8880/book/save

像这样保存:

String bookid=JSON?.bookid
  String name=JSON?.name
def b =bookService.save(bookid,name

在数据库中是这样存储的:

+--------+-------+
| bookid | name  |
+--------+-------+
| 3      | "C++" |
+--------+-------+

我希望书名只是C++

谢谢 SR

【问题讨论】:

  • 数据库中name 的类型是什么? name 在“进入”数据库之前的价值是多少?您是否检查过手动插入任何其他值——它可能只是一个“演示”的东西。当您从数据库中检索name 时,它的值是多少?我认为所有这些问题都可能导致您解决问题:)
  • @x80486 我正在将 GORM 数据服务与 Mysql 一起使用。杰夫的例子工作得很好。谢谢

标签: json grails micronaut


【解决方案1】:

我知道我来晚了,但我一直在寻找解决方案,但没有找到任何东西。经过大量努力,我发现发送带有“@BODY”的杰克逊“对象”没有帮助,当我将类型更改为“字符串”时,它对我有用。

这是我的代码

def save(@Body String JSON){

    def result = [:]
    ObjectMapper objectMapper = new ObjectMapper();

    //convert json string to object
    def obj = objectMapper.readValue(JSON, Course.class);
    println(obj)

    Course course = new Course(name: obj?.name, pre: obj?.pre,
            regno: obj?.regno, enrolled: obj?.enrolled)

    course.validate()
    if(course.hasErrors()){
        println("Error: "+course.errors)
        result.put("Error is: ",course.errors)
        return result;
    }

    course.save(flush:true,failOnError: true)

    result.put("Message","Successfully Created")
    result.put("Result",course)
    return HttpResponse.created(result)
}

将它传递给 ObjectMapper,然后将它从 JSON 字符串转换为 Java 对象对我有用。

我传递的Json字符串如下:

{
 "name" : "Data Structures",
 "pre" : "Computer Programming",
 "regno" : "249",
 "enrolled" : "90"
}

这是数据库更改前后数据的存储:

+----+---------+------------------------+-------------------------------+----+
| id | version |        name      |   pre       |     regno        |enrolled |
+----+---------+------------------------+-------------------------------+----+
|  1 | 0 | "Computer Programming" | "Introduction to Programming"| "233"|"26"|
|  2 | 0 | Data Structures        | Computer Programming         |  249 | 90 |
+----+---------+------------------------+-------------------------------+----+

希望答案能帮助任何正在寻找上述解决方案的替代解决方案的人。

【讨论】:

  • 感谢分享代码。很高兴知道另一种解析参数的方法。
  • 感谢您考虑我的回答
  • 我不认为这适用于 micronauts - def 表明它是 groovy 可能是 micronaut groovy 微服务应用程序。我仍然认为它不是 micronaut,因为 ObjectMapper objectMapper = new ObjectMapper(); 在 java micronaut 项目的端口 80 上运行的控制器中声明时返回有关 netty 和端口 8080 正在使用的错误 -
【解决方案2】:

您没有提供有关您的项目的足够信息来了解正在发生的事情,但https://github.com/jeffbrown/sfgroupsjsonbinding/tree/master 的项目演示了内置绑定的工作原理。请参阅那里的 README.md 文件。

https://github.com/jeffbrown/sfgroupsjsonbinding/blob/3ff4e8b39ba5fda9956ebfc67cd0b9e5d940b8f2/src/main/groovy/sfgroupsjsonbinding/BookController.groovy

package sfgroupsjsonbinding

import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Post

@Controller('/book')
class BookController {

    private PersonService personService

    BookController(PersonService personService) {
        this.personService = personService
    }

    @Get('/')
    List<Person> list() {
        personService.list()
    }

    @Post('/')
    Person save(Person person) {
        personService.save person
    }

    @Get('/{id}')
    Person get(long id) {
        personService.get id
    }
}

与应用交互

 $ curl -H "Content-Type: application/json" -d '{"name":"Jeff"}' http://localhost:8080/book
{"name":"Jeff","id":1}
 $ 
 $ curl -H "Content-Type: application/json" -d '{"name":"Jake"}' http://localhost:8080/book
{"name":"Jake","id":2}
 $ 
 $ curl -H "Content-Type: application/json" -d '{"name":"Zack"}' http://localhost:8080/book
{"name":"Zack","id":3}
 $ 
 $ curl http://localhost:8080/book
[{"name":"Jeff","id":1},{"name":"Jake","id":2},{"name":"Zack","id":3}]
 $ 
 $ curl http://localhost:8080/book/1
{"name":"Jeff","id":1}
 $ 
 $ curl http://localhost:8080/book/2
{"name":"Jake","id":2}
 $ 
 $ curl http://localhost:8080/book/3
{"name":"Zack","id":3}
 $ 

【讨论】:

    【解决方案3】:

    似乎我的命令类扩展了一些其他类导致了一些问题,这意味着没有任何效果。目前它确实有效,并且确实是 Zaryab baloch 上述建议的有效替代方案。

    package gateway.command.controller;
    
    
    import com.fasterxml.jackson.annotation.JsonProperty;
    import gateway.command.event.commands.HotelSaveCommand;
    import io.micronaut.http.HttpResponse;
    import io.micronaut.http.MediaType;
    import io.micronaut.http.annotation.Body;
    import io.micronaut.http.annotation.Controller;
    import io.micronaut.http.annotation.Post;
    import io.micronaut.http.codec.MediaTypeCodecRegistry;
    import io.micronaut.jackson.codec.JsonMediaTypeCodec;
    import lombok.extern.slf4j.Slf4j;
    
    import javax.inject.Inject;
    
    @Slf4j
    @Controller("/")
    public class GatewayController  {
    
        @Inject
        protected MediaTypeCodecRegistry mediaTypeCodecRegistry;
    
        /**
         *
         * @param topic
         * @param eventType using the jsonProperty we actually extract eventType from the @Body string JSON String
         *                  The 3rd input is actual form. we post /hotel and json content there isn't actually 3 parameters
         *                  provided
         * @param
         * @return
         */
        @Post(uri = "/{topic}", consumes = MediaType.APPLICATION_JSON)
        public HttpResponse process(String topic, @JsonProperty("eventType") String eventType, @Body String formInput)  {
    
            JsonMediaTypeCodec mediaTypeCodec = (JsonMediaTypeCodec) mediaTypeCodecRegistry.findCodec(MediaType.APPLICATION_JSON_TYPE)
                    .orElseThrow(() -> new IllegalStateException("No JSON codec found"));
    
            HotelSaveCommand command =  mediaTypeCodec.decode(HotelSaveCommand.class,formInput);
            if (command!=null) {
                System.out.println(command +" "+ command.getName());
            }
            //eventPublisher.publish(topic,);
            return HttpResponse.accepted();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 2019-03-16
      • 1970-01-01
      • 2014-06-16
      • 2021-09-28
      • 2021-07-09
      • 1970-01-01
      • 2019-09-28
      • 2012-09-03
      相关资源
      最近更新 更多