当前位置: 首页 > 知识库问答 >
问题:

Java Spring Boot JSON响应

童铭晨
2023-03-14

我对Grafana和Spring Boot很陌生。我正在尝试创建一个Spring Boot应用程序,并使用Grafana SimpleJSON插件从我的Spring BootAPI中获取数据并创建图形。(仅供参考,与我的问题不太相关-我遵循这里的说明。)https://grafana.com/grafana/plugins/grafana-simple-json-datasource/)

现在,我只是将数据硬编码到我的Spring Boot应用程序中,但我一直在获取所需的正确JSON格式。

我想要的:

[  
  {  
    "columns":[  
      {"text":"Time","type":"time"},  
      {"text":"Country","type":"string"},  
      {"text":"Number","type":"number"}  
    ],  
    "rows":[  
      [1234567,"SE",123],  
      [1234567,"DE",231],  
      [1234567,"US",321]  
    ],  
    "type":"table"  
  }  
]  

实现这一点的最佳方式是什么?

到目前为止,我已经尝试创建一个自定义类,还尝试只使用Map(如何在Springboot中返回JSON响应?)。但在这两种方法中都遇到了相同的问题——“行”中的数据具有不同的类型(例如[1234567,“SE”,123])。我怎么能这么说?

@PostMapping("/query")
public ??? getData() {
    ...
}

谢谢

共有2个答案

裴英锐
2023-03-14

我想最简单的方法是定义DTO类。

    public class MyObject {
    private List<TextType> columns;//you have to define TextType class
    private List<Object[]> rows;
    private String type;
    
    //Getters and setters
}

如果行中有混合类型,则无法定义类型;但是,您可以在运行时对其进行调整。否则,如果rows元素有3个元素,则可以定义类型。

    public class MyObject2 {
    private int i1;
    private String s1;
    private int i2;
    
    //Getters and setters
    //Define your own format that print i1, s1, i2 instead of {"i1": i1, "s1":s1, "i2":i2}
}
彭浩穰
2023-03-14

您需要为这种情况定义正确的返回类型。

有人认为这样应该行得通:

@PostMapping("/query")
public List<Item> getData() {
    List<Item> response = new ArrayList<>();
    Item item = new Item();
    item.type = "table";
    Column col1 = new Columne("Time", "time");
    item.columns.add(col1);
    // add other columns
    item.rows.add(new Object[] {1234567, "SE", 123})
    // add other rows
    response.add(item);
    return response;
}

class Item {
  public String type;
  public List<Column> columns = new ArrayList<>();
  public List<Object[]> rows = new ArrayList<>();
}

class Column {
  public String text;
  public String type;
  public Column(String text, String type) {
    this.text = text;
    this.type = type;
  }
}
 类似资料:
  • 当一个应用在处理完一个请求后, 这个应用会生成一个 response 响应对象并把这个响应对象发送给终端用户 这个响应对象包含的信息有 HTTP 状态码,HTTP 头和主体内容等, 从本质上说,网页应用开发最终的目标就是根据不同的请求去构建这些响应对象。 在大多数实际应用情况下,你应该主要地去处理 response 这个 应用组件, 在默认情况下,它是一个继承自 yii\web\Response

  • CabalPHP 的请求(Request)和响应(Response)对象依赖 zendframework/zend-diactoros 实现了 PSR-7标准 psr/http-message 中的 Psr\Http\Message\ServerRequestInterface和Psr\Http\Message\ResponseInterface 的全部接口,同时也扩展了自己的一些实用方法方便使用

  • 在 Hyperf 里可通过 Hyperf\HttpServer\Contract\ResponseInterface 接口类来注入 Response 代理对象对响应进行处理,默认返回 Hyperf\HttpServer\Response 对象,该对象可直接调用所有 Psr\Http\Message\ResponseInterface 的方法。 注意 PSR-7 标准为 响应(Response) 进

  • 响应对象封装了从服务器返回到客户端的所有信息。在HTTP协议中,这些信息是包含在从服务器传输到客户端的HTTP头信息或响应的消息体中。

  • Response对象的属性。 Response.url 最终的URL。 Response.text 响应内容,以unicode为单位。 如果Response.encoding是None且chardet模块可用,则将猜测内容的编码。 Response.content 响应内容,以字节为单位。 Response.doc 一个PyQuery响应的内容的对象。链接默认为绝对链接。 请参阅PyQuery的文

  • 我试图用制作一个响应线图。 我用这个MWE重现了我的尝试: 如果我让浏览器更宽,线条图会像你期望的那样响应,填满空间。 我的问题是,如果我使浏览器变窄,图形不会像我使其变宽时那样调整大小以填充浏览器宽度的100%。对于新的浏览器宽度来说,它仍然太宽。有趣的是,在刷新时,图形总是占据浏览器的100%。 把浏览器做宽做窄,如何让图占据浏览器的100%?

  • 我用IntelliJ创建了一个非常简单的流测试。 IntelliJ无法完成测试,并给了我错误 这导致假设响应程序流不执行任何操作。 启动器流被执行。我可以看到这一点,因为命令显示在日志中。但是,我不知道响应器流是否从未由发起方流启动,或者只是没有响应。也许你可以帮我。 谢谢

  • 主要内容:HTTP响应完整格式HTTP响应完整格式 HTTP的响应也由三部分组成(响应行+响应头+响应体): 以下是一个实际的HTTP响应示例: ①报文协议及版本; ②状态码及状态描述; ③响应报文头,也是由多个属性组成; ④响应报文体,即我们真正要的“干货”。