我正在使用JPA Toplink,JAX-RS,NetBean6.9
到目前为止,我成功地将具有一种对象类型的List的JPQL查询结果转换为JSON。 以下工作正常,它到达浏览器时生成JSON,因为我在JPA注释中指定了
JPA代码段
@XmlRootElement //here enable JSON
@Entity
@Table(name = "MasatosanTest")
资源类摘要
@Path("allJoin")
@GET
@Produces("application/json")
public List<MasatosanTest> getAllJoinResult() {
EntityManager em = null;
List<Object[]> mt = null;
try {
em = EmProvider.getDefaultManager();
Query query = em.createQuery("SELECT m1, m2 FROM MasatosanTest m1, MasatosanTest2 m2");
mt = query.getResultList();
}
catch(Exception e) {
System.out.println("MasatosanTestResource.java - getJoinedResult ERROR: " + e);
}
finally {
if(em != null) {
em.close();
}
}
//I'm only adding MasatosanTest object into the List not MasatosanTest2
List<MasatosanTest> list = new ArrayList<MasatosanTest>();
MasatosanTest mt = null;
for(Object[] items : mt) {
mt = (MasatosanTest)items[0];
list.add(mt);
}
return list;
}//end getAllJoinResult()
浏览器中的上述代码将输出如下内容:
[MasatosanTest : [[name:foo], [name:moo]]
我的问题是当JPQL返回2种不同的Object类型时,它将不再自动转换为JSON。
如果我修改上面的代码,我也会将MasatosanTest2添加到列表中。
//Now I'm adding MasatosanTest2 to the List in addition to MasatosanTest
//So changing List data type to List<Object> to accept both object types.
List<Object> list = new ArrayList<Object>();
MasatosanTest mt = null;
MasatosanTest2 mt2 = null;
for(Object[] items : mt) {
mt = (MasatosanTest)items[0];
mt2 = (MasatosanTest2)items[1];
list.add(mt);
list.add(mt2)
}
return list;
然后当然也将方法返回类型返回到List。
public List<Object> getAllJoinResult() {
然后我收到错误抱怨它不能是JSON :(
A message body writer for Java type, class java.util.ArrayList,
and MIME media type, application/json, was not found
是否允许JSON包含多种类型?
我的目标是让JSON像:
[[MasatosanTest : [[name:foo], [name:moo]],
[MasatosanTest2 : [[name:boo], [name:www]] ]
答案 0 :(得分:1)
根据其他人的在线帮助对少数人进行测试后,我认为返回的查询结果为List<Object[]>
,而Object[]
实际上是Vector
。
所以,下面会做这个工作(不确定是否足够有效) JSONStringer也来自jettison api。
List<Object[]> out = null;
JSONStringer jstr = null;
sb = new StringBuilder();
Vector vec = null;
for(Object item : out) {
vec = (Vector)item;
jstr = new JSONStringer();
String json = jstr.object()
.key("columnName1").value( vec.get(0) )
.key("columnName2").value( vec.get(1) )
.key("columnName3").value( vec.get(2) )
.key("columnName4").value( vec.get(3) )
.key("columnName5").value( vec.get(4) )
.endObject().toString();
sb.append(json).append(",");
jstr = null;//reset
}
sb.deleteCharAt(sb.length() - 1);
System.out.println("====== json out result =====> " + sb.toString());