Java XPages:从分类视图创建Json字符串
我想使用Java从分类视图创建一个Json字符串,但我无法将Json子类别保留在父类别下。我一直在获取以下输出: {“标识符”:“id”,“标签”:“状态”,“项目”:[ 想知道是否可以从2级分类视图生成JSON字符串,或者是否有更好的方法来实现它 下面是我的java方法:Java XPages:从分类视图创建Json字符串,java,xpages,Java,Xpages,我想使用Java从分类视图创建一个Json字符串,但我无法将Json子类别保留在父类别下。我一直在获取以下输出: {“标识符”:“id”,“标签”:“状态”,“项目”:[ 想知道是否可以从2级分类视图生成JSON字符串,或者是否有更好的方法来实现它 下面是我的java方法: public ResponseWriter getJSONData() { long startTime = System.currentTimeMillis(); FacesContext
public ResponseWriter getJSONData() {
long startTime = System.currentTimeMillis();
FacesContext facesContext = FacesContext.getCurrentInstance();
ResponseWriter resWriter = facesContext.getResponseWriter();
//StringWriter stringOut = new StringWriter();
JsonWriter writer = new JsonWriter(resWriter,false);
Database db = null;
try {
writer.startObject();
writer.startProperty("identifier");
writer.outStringLiteral("id");
writer.endProperty();
writer.startProperty("label");
writer.outStringLiteral("State");
writer.endProperty();
writer.startProperty("items");
writer.startArray();
db = DominoUtils.getCurrentSession().getCurrentDatabase();
View lookupDB = db.getView("StateAndCity");
//Document doc = lookupDB.getFirstDocument();
ViewNavigator nav = lookupDB.createViewNav();
ViewEntry ve = nav.getFirst();
boolean run =false;
while (ve != null){
counter++;
Vector cv = ve.getColumnValues();
int level = ve.getIndentLevel();
String levelTitle = (String) cv.get(level);
writer.startArrayItem();
writer.startObject();
if (ve.isCategory()) {
if (run) {
writer.endArrayItem();
writer.endArray();
}
run= true;
writer.startArrayItem();
writer.startProperty("id");
writer.outStringLiteral(getID());
writer.endProperty();
writer.startProperty("title");
writer.outStringLiteral(levelTitle);
writer.endProperty();
writer.startProperty("category");
writer.outStringLiteral("true");
writer.endProperty();
writer.startProperty("children");
writer.startArray();
}else{
writer.startArrayItem();
writer.startObject();
Document doc = ve.getDocument();
writer.startProperty("id");
writer.outStringLiteral(getID());
writer.endProperty();
writer.startProperty("docId");
writer.outStringLiteral(doc.getUniversalID());
writer.endProperty();
writer.startProperty("title");
writer.outStringLiteral(levelTitle);
writer.endProperty();
writer.startProperty("category");
writer.outStringLiteral("false");
writer.endProperty();
writer.endObject();
writer.endArrayItem();
}
ViewEntry tmpentry = nav.getNext();
ve.recycle();
ve = tmpentry;
}
writer.endArray();
writer.endProperty();
writer.endObject();
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
//System.out.println("running time: "+totalTime);
writer.flush();
return resWriter;
}catch (NotesException e) {
e.printStackTrace();
}
return resWriter;
}
更新:
我想使用我的返回JSON创建一个如下类型的网格,但有两个级别的类别State和City
JSON输出
{
"identifier": "id",
"label": "name",
"items": [{
"id": "AK",
"type": "state",
"state": "AK",
"childItems": [{
"id": "Anchorage",
"type": "city",
"city": "Anchorage",
"numPeople": "2",
"childItems": [{
"id": "B3093953178C98E905257838007ABC48",
"firstname": "Bella",
"lastname": "Martin",
"valueToAdd": "2"
},
{
"id": "7FDB9CCDE7D6923E05257838007ABC1E",
"firstname": "Brian",
"lastname": "Leggett",
"valueToAdd": "2"
}
]
}]
....
}]
}
您可以退回到“旧的”Domino技巧,取消所有Java。将视图定义为Passthru HTML,并创建mime类型为“text/Json”的“$$ViewTemplate for ViewName”表单。然后您可以使用?Openview访问输出。根据需要添加Json标记
或者只使用…/viewname?ReadviewEntries&Outputformat=json
内置Json输出您可以退回到“旧”Domino技巧,取消所有Java。将视图定义为Passthru HTML,并创建mime类型为“text/Json”的“$$ViewTemplate for ViewName”表单。然后您可以使用?Openview访问输出。根据需要添加Json标记
或者只使用…/viewname?ReadviewEntries&Outputformat=json
内置Json输出看起来您的代码在写任何东西之前就崩溃了。这里有几个有问题的语句:
- 向量/数组是基于零的,但
不是,因此很可能会出现索引越界错误int-level=ve.getIndentLevel();
- 如果某个内容返回null,则对字符串的转换也将出错。因此,将
更改为String levelTitle=(String)cv.get(level);
String levelTitle=String.valueOf(cv.get(level));
- 我建议您将方法签名更改为类似于
然后使用一些包装器代码来调用该方法。这也允许您在Domino命令行应用程序中使用该类,在Designer/Eclipse中本地调试该类非常方便。因为该类没有XPages依赖项,这使操作更简单。我以这种方式开发了所有VoP:核心没有服务器,只有Notes类依赖项。您将创建这样的测试类(省略错误处理):publicstringgetjsonfromview(finaldatabasedb,finalstringviewname){…}
让我们知道需要澄清的内容。您的代码似乎在编写任何内容之前就崩溃了。这里有几个有问题的语句:
- 向量/数组是基于零的,但
不是,因此很可能会出现索引越界错误int-level=ve.getIndentLevel();
- 如果某个内容返回null,则对字符串的转换也将出错。因此,将
更改为String levelTitle=(String)cv.get(level);
String levelTitle=String.valueOf(cv.get(level));
- 我建议您将方法签名更改为类似于
然后使用一些包装器代码来调用该方法。这也允许您在Domino命令行应用程序中使用该类,在Designer/Eclipse中本地调试该类非常方便。因为该类没有XPages依赖项,这使操作更简单。我以这种方式开发了所有VoP:核心没有服务器,只有Notes类依赖项。您将创建这样的测试类(省略错误处理):publicstringgetjsonfromview(finaldatabasedb,finalstringviewname){…}
让我们知道需要澄清的内容。但无法使用输出创建TreeGrid,也就是说,我正在使用Java来定义需要哪些字段或项放在一起确定,因此您需要JSON的特定结构。您能用您需要的输出修改您的问题吗?有两种可能的途径:JsonWriter和JSON seriliza因为后来的格森是一个很好的选择(例如用在Prem的诗中)但无法使用输出来创建TreeGrid,也就是说,我正在使用Java来定义所需的字段或项。OK,因此您需要JSON的特定结构。您能用所需的输出修改您的问题吗?有两种可能的途径:JsonWriter和JSON序列化。对于以后的GSON,这是一个不错的选择(例如在Prem上的诗句中使用)
public class Test1 {
public static void main(String args[]) {
NotesThread.sinitThread();
Session s = NotesFactory.createSession();
Database db = s.openDatabase("someserver","somedb");
Yourclass yc = new Yourclass();
System.out.println(yc.getJSONFromView(db,"viewname");
db.recycle();
s.recycle();
NotesThread.stermThread();
}
}