使用 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 对象,这会给出所需的结果。
我有一个 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 对象,这会给出所需的结果。