2017-08-29 9 views
0

Javaを使用して分類されたビューからJson Stringを作成したいと思いますが、Jsonの子カテゴリを親の下に置くことができませんでした。XPages:分類されたビューからJson Stringを作成する

{ "識別子": "ID"、 "ラベル": "州"、 "アイテム":[

はそれがかのうJSONを生成するかどうかを知るでしょう、私は以下の出力をgeting保ちます2レベルの分類されたビューからの文字列、またはそれを達成するためのより良い方法があるかどうか。

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; 
    } 

UPDATE: は、タイプの下が、2つのレベルのカテゴリの状態でこれのグリッドをレコード生成するために、私のリターンJSONを使用したいと市

enter image description here以下

は私のJavaメソッドであります

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" 
       } 
      ] 
     }] 

.... 
    }] 
} 

答えて

1

に... /ビュー名?ReadviewEntries & OUTPUTFORMAT = JSON

ビルドを使用します。いくつかの問題文があります。

  • ベクトル/配列はゼロベースですが、何かが文字列にnullをキャストを返す場合、あなたが最も可能性の高い
  • バウンドエラーのうちのインデックスを取得することは、あまりにもエラーになりますのでint level = ve.getIndentLevel();ではなく、 。変更するString levelTitle = (String) cv.get(level);String levelTitle = String.valueOf(cv.get(level));
  • public String getJSONFromView(final Database db, final String viewName) {...}のようにメソッドシグネチャを変更することをお勧めします。そのメソッドを呼び出すためのラッパーコードが少しあります。これにより、Dominoコマンドラインアプリでクラスを使用することができます。これは、ローカルでDesigner/Eclipseでデバッグするのが非常に快適です。クラスにはXPagesの依存関係がないため、人生が楽になります。私はすべてのVoPをそのように開発しました。コアにはサーバーがなく、Notesクラスの依存関係のみでした。あなたは(エラー処理は省略)。このようにテストクラスを作成します。

    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(); 
        } 
    } 
    

あなたは、ドミノデザイナーにJavaパースペクティブに切り替えて、あなたがそれを置く、標準のJavaプロジェクトを作成する必要があります。そうすれば、XPageでJavaクラスを使用する前に、Javaクラスを自分の望むものにすることができます。

私は何か同じように書きましたが、あなたはcheck it outです。

明確にする必要があることをお知らせください。

1

「古い」ドミノ・トリックに落ちて、すべてのJavaを取り除くことができます。ビューをパススルーHTMLとして定義し、MIMEタイプが "text/Json"の "$$ ViewTemplate for ViewName"フォームを作成します。 Openviewで出力にアクセスできます。必要に応じてJsonマークアップを振りかける

それとも、あなたのコードは、それが何かを書くことができます前に、クラッシュしたように見えたJSON出力

+0

しかし、出力を使ってTreeGridを作成することはできません。つまり、Javaを使用して、必要なフィールドやアイテムをまとめて定義しています。 –

+0

OK、JSONの特定の構造が必要です。必要な出力で質問を修正できますか? JsonWriterとJsonのserilizationの2つの方法があります。後のGSONについては良い選択です(たとえばVerse on Premで使用) – stwissel

+0

私は質問を更新しました –

関連する問題