Java XPages:从分类视图创建Json字符串

Java XPages:从分类视图创建Json字符串,java,xpages,Java,Xpages,我想使用Java从分类视图创建一个Json字符串,但我无法将Json子类别保留在父类别下。我一直在获取以下输出: {“标识符”:“id”,“标签”:“状态”,“项目”:[ 想知道是否可以从2级分类视图生成JSON字符串,或者是否有更好的方法来实现它 下面是我的java方法: public ResponseWriter getJSONData() { long startTime = System.currentTimeMillis(); FacesContext

我想使用Java从分类视图创建一个Json字符串,但我无法将Json子类别保留在父类别下。我一直在获取以下输出:

{“标识符”:“id”,“标签”:“状态”,“项目”:[

想知道是否可以从2级分类视图生成JSON字符串,或者是否有更好的方法来实现它

下面是我的java方法:

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));
  • 我建议您将方法签名更改为类似于
    publicstringgetjsonfromview(finaldatabasedb,finalstringviewname){…}
    然后使用一些包装器代码来调用该方法。这也允许您在Domino命令行应用程序中使用该类,在Designer/Eclipse中本地调试该类非常方便。因为该类没有XPages依赖项,这使操作更简单。我以这种方式开发了所有VoP:核心没有服务器,只有Notes类依赖项。您将创建这样的测试类(省略错误处理):

您可能需要切换到DominoDesigner中的Java透视图,并在其中创建一个标准Java项目。这应该允许您在XPage中使用Java类之前,让Java类做您想做的事情

我写了一些类似的东西,你可以


让我们知道需要澄清的内容。

您的代码似乎在编写任何内容之前就崩溃了。这里有几个有问题的语句:

  • 向量/数组是基于零的,但
    int-level=ve.getIndentLevel();
    不是,因此很可能会出现索引越界错误
  • 如果某个内容返回null,则对字符串的转换也将出错。因此,将
    String levelTitle=(String)cv.get(level);
    更改为
    String levelTitle=String.valueOf(cv.get(level));
  • 我建议您将方法签名更改为类似于
    publicstringgetjsonfromview(finaldatabasedb,finalstringviewname){…}
    然后使用一些包装器代码来调用该方法。这也允许您在Domino命令行应用程序中使用该类,在Designer/Eclipse中本地调试该类非常方便。因为该类没有XPages依赖项,这使操作更简单。我以这种方式开发了所有VoP:核心没有服务器,只有Notes类依赖项。您将创建这样的测试类(省略错误处理):

您可能需要切换到DominoDesigner中的Java透视图,并在其中创建一个标准Java项目。这应该允许您在XPage中使用Java类之前,让Java类做您想做的事情

我写了一些类似的东西,你可以


让我们知道需要澄清的内容。

但无法使用输出创建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();
   }
}