使用 Gson 将 Java 对象列表转换为 Json 中正确的名称值对格式

Convert Java object list to correct name value pair format in Json using Gson

我有一个 Java Class 名为

的用户
@Column(name = "id")
private Long id;
@NotNull
@Column(name = "NAME")
private String name;

我正在尝试获取列表中的一些详细信息并将其转换为 JSOn,如下所示:

Session session = this.sessionFactory.getCurrentSession();
String queryString="select id,name from User where unit=:name";
Query query= sessionFactory.getCurrentSession().createQuery(queryString);
query.setParameter("name", name);
List<User> users= (List<User>) query.list();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
Map<String, List<User>> wrap = new HashMap<>();
wrap.put("users", users);  // wrap user list in a map
String json = gson.toJson(wrap);

这会产生 JSON

{
 "users": [
 [
  1,
  "Room"
],
[
  2,
  "Regi"
 ],
 ]
}

我要如何更改它才能获得 JSON 赞

{
 "users": [
 [
   "id":1,
   "name":"Rovom"
 ],
 [
   "id":2,
   "name":"Regi"
 ],
]
}

编辑 我意识到这是导致问题的查询。如果我使用

String queryString="from User where unit=:name";

它给出了正确的格式。我该如何解决这个问题?

杰克逊,它看起来像这样:

   String json = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueToString(wrap);

你至少需要 jackson-core 和 jackson-databind。

使用 Jackson 的完整示例:

public static class User {
    private Long id;
    private String name;

    public User(long i, String n) {
        id = i;
        name = n;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

public static void main(String... args) {
    try {
        Map<String,Object> map = new HashMap<>();
        map.put("users",  Arrays.asList(new User(1, "Stack"), new User(2, "Overflow")));
        System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter()
                .writeValueAsString(map));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

产生了这个输出:

{
  "users" : [ {
    "id" : 1,
    "name" : "Stack"
  }, {
    "id" : 2,
    "name" : "Overflow"
  } ]
}

嗯,看起来像是运行时的类型擦除。

您的 List<User> 与第一个查询实际上是 List<Object[]> 序列化的。您是否尝试访问列表之外的用户对象,我想您会遇到运行时错误。

查看休眠文档:

Return the query results as a List. If the query contains multiple results pre row, the results are returned in an instance of Object[].

编辑

要获取仅填充了两个字段的用户列表,请创建适当的构造函数并使用类似

的查询
select new package.path.to.class.User(id,name) from User where unit=:name"

正如用户@Turo 所提到的,这是因为运行时的类型擦除。

要解决此问题,必须将查询更改为

String queryString="select id,name from User where unit=:name";
Query query= sessionFactory.getCurrentSession().createSQLQuery(queryString).addScalar("name", new StringType()).addScalar("id", new IntType()).setResultTransformer(Transformers.aliasToBean(User.class));

query.setParameter("name", name);

addScalar() 会将值映射到 User 对象,这会给出所需的结果。