在 PostgreSQL java 21 quarkus 3.91 中使用具有 JSON 数据列的本机查询时,如何返回有效的 json 对象而不是字符串

问题描述 投票:0回答:1

我有一个 Quarkus 项目,其中包含一个用于存储地址详细信息的 JSON 类型列的用户实体。此列中的数据当前在 API 响应中作为字符串返回,而不是 JSON 对象。我想正确地将这些数据反序列化为 JSON 对象。以下是相关代码和设置:

实体:

java


package org.acme;

import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import jakarta.persistence.*;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;
import java.util.Map;

@Table(name = "user_test")
@Entity
public class User extends PanacheEntityBase {
    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer userId;

    @Column(name = "name")
    public String name;

    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "address", columnDefinition = "json")
    public Map<String, String> address;
}

服务:

java

package org.acme;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import java.util.List;

@ApplicationScoped
public class UserService {
    @Inject
    EntityManager em;

    public List<Object[]> getUser() {
        String sql = "SELECT * FROM user_test";
        Query q = em.createNativeQuery(sql);
        return q.getResultList();
    }
}

控制器:

java

package org.acme;

import jakarta.inject.Inject;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;

@Path("/api")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class GreetingResource {
    @Inject
    UserService userService;

    @POST
    @Path("/usr")
    public Object getUsers() {
        return userService.getUser();
    }
}

API 响应(localhost:8080/api/usr):

json

[
    [
        2,
        "{\"zip\": \"98765\", \"city\": \"Springfield\", \"street\": \"1234 Oak St\"}",
        "John Doe"
    ]
]

地址字段作为 JSON 编码字符串返回,但我希望它是一个正确的 JSON 对象。

如何修改我的设置,以便将地址字段正确反序列化为 API 响应中的 JSON 对象?

java json deserialization quarkus dialect
1个回答
0
投票

只需将地址对象映射为 Address Pojo 而不是 Map。

© www.soinside.com 2019 - 2024. All rights reserved.