You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Quarkus无法将简单字符串序列化为合法JSON

问题原因分析

Quarkus基于JAX-RS规范实现REST接口,而JAX-RS对String类型的返回值有特殊处理逻辑:当方法返回String时,不管你通过@Produces指定了什么媒体类型,默认都会直接输出字符串原始内容,不会经过Jackson这类JSON序列化器处理——这就是为什么返回的字符串没有被加上JSON字符串所需的引号,但Content-Type头仍会按你指定的application/json返回,最终导致内容与头信息不匹配的无效JSON。

解决方案

下面提供几种可行的解决方式,按推荐程度排序:

1. 使用包装类封装字符串(推荐)

创建一个简单的POJO类来包裹字符串,这样Jackson会正常序列化整个对象,生成合法的JSON:

package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    // 定义包装类
    public static class GreetingResponse {
        public String content;

        public GreetingResponse(String content) {
            this.content = content;
        }
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public GreetingResponse hello(){
        return new GreetingResponse("Hello from Quarkus REST");
    }
}

此时响应会是合法的JSON对象:

200 OK HTTP/1.1
Content-Type: application/json

{"content":"Hello from Quarkus REST"}

2. 手动使用Jackson序列化字符串

注入Quarkus提供的ObjectMapper,手动将字符串序列化为JSON格式:

package org.acme;

import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @Inject
    ObjectMapper objectMapper;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String hello() throws Exception {
        // 手动序列化字符串为JSON格式
        return objectMapper.writeValueAsString("Hello from Quarkus REST");
    }
}

此时响应会是你预期的带引号的JSON字符串:

200 OK HTTP/1.1
Content-Type: application/json

"Hello from Quarkus REST"

3. 返回Object类型替代String

将方法返回类型改为Object,这样JAX-RS会将返回值交给Jackson处理,而不是直接输出字符串:

package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Object hello(){
        return "Hello from Quarkus REST";
    }
}

这种方式可以直接得到带引号的JSON字符串,但返回Object类型会损失一些类型安全性,需要根据实际场景选择。


内容的提问来源于stack exchange,提问作者UndefinedUserAtSO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:33:28