我使用Java,Play框架使用Java而不是Scala,MongoDB和Jongo作为基本Web CRUD应用程序的组合。我一直收到一个JSON解析异常,即使我的字符串不包含任何非法字符。它实际上在声明结尾处没有关闭花括号。以下是我的错误和代码。查询字符串只是一个字符串构建器,搜索对象是否为空或具有值,如果它具有附加到字符串的值。
Jongo方法:
public static Iterable<OneDomain> findWithQueryString(String queryString){
return domains().find("{#}", queryString).as(OneDomain.class);
}
控制器方法: 字符串构建器示例:
if(queryStringBuilder.toString().equalsIgnoreCase("")){
queryStringBuilder.append("date: {$gte : " + searchObj.dateFrom + ", $lt: " + searchObj.dateTo + "}");
}else{
queryStringBuilder.append(" , ");
queryStringBuilder.append("date: {$gte : " + searchObj.dateFrom + ", $lt: " + searchObj.dateTo + "}");
}
String queryString = queryStringBuilder.toString();
Iterable<OneDomain> filteredIterable = OneDomain.findWithQueryString(queryString);
给我这个错误:
Caused by: com.mongodb.util.JSONParseException:
{"source : Online Lists , blacklist : true , vetted : true , is : false , isNot : true"}
^
错误在&#34;}&#34;结束它。
除此之外,如果我试图通过放入\&#34;来逃避角色。所以它变成\&#34; date \&#34;它会像这样解析和错误:
Caused by: com.mongodb.util.JSONParseException:
{"\"source\" : \"Online Lists\" , \"blacklist\" : true , \"vetted\" : true , \"is\" : false , \"isNot\" : true"}
我可以实际执行此操作,或者因为它的Java被插入其中,引号将围绕整个字符串,因此它尝试将其作为单个JSON字段读取而不是整个字符串查询?
答案 0 :(得分:3)
虽然你确实可以将生成的查询字符串传递给find方法,但我不建议它。当我们生成包含jongo替换参数#的查询时,我也做了同样的问题并且遇到了很大问题,即
// This will throw an exception:
// java.lang.IllegalArgumentException: Not enough parameters passed to query: {"value":"#"}
...find("{" + "\"value\":\"#\"" + "}")
我的解决方案是传递DBObject:
import com.mongodb.BasicDBObject
...find("#", new BasicDBObject().append("value", "#"))
它也可以使用QueryBuilder构建:
import com.mongodb.QueryBuilder
...find("#", QueryBuilder.start("value").is("#").get())
尽管在Jongo API中直接使用查询构建器支持会很好:https://github.com/bguerout/jongo/issues/173
答案 1 :(得分:0)
找到答案。需要删除替换,而我的方法看起来像
domains().find("{"+queryString+"}").as(OneDomain.class);