Put this piece of code into a view column; in _exclude list all items from the document, that should not be included in the output All items in the document that are not excluded are used to build a JSON String =========================== @Formula START ========================================= _exclude:="$FILE":"$Fonts":"Form":"$UpdatedBy":"$Revisions":"ID":"ModifiedBy":"AddressInvoiceAppartment"; _fld:=@Trim(@ReplaceSubstring(@DocFields;_exclude;@Nothing)); "{\"@unid\":\"" +@Text(@DocumentUniqueID)+"\"," + @Implode ( @Transform ( _fld; "_fn" ; "\"" + _fn + "\":\"" + @Text ( @GetField ( _fn) ) + "\"" ) ; "," ) + "}," =========================== @Formula END========================================= To retrieve the JSON string, create a new XAgent =========================== XAgent START========================================= <?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false"> <xp:this.afterRenderResponse><![CDATA[#{javascript:try{ var externalContext = facesContext.getExternalContext(); var writer = facesContext.getResponseWriter(); var response = externalContext.getResponse(); // Set content type response.setContentType("application/json"); response.setHeader("Cache-Control", "no-cache"); var json:java.lang.StringBuilder = new java.lang.StringBuilder(); var v:NotesView = database.getView("($jsonContact)"); //do not do AutoUpdates v.AutoUpdate = false; var nav:NotesViewNavigator = v.createViewNav(); nav.setEntryOptions( NotesViewNavigator.VN_ENTRYOPT_NOCOUNTDATA); //enable cache for max buffering nav.BufferMaxEntries = 400 var entry:NotesViewEntry = nav.getFirst(); while (entry != null) { json.append( entry.getColumnValues().elementAt(0).toString()); var tmpentry:NotesViewEntry = nav.getNext(entry); entry.recycle(); entry = tmpentry; } writer.write('[' + @Left(json.toString(), @Length(json.toString()) - 1) + ']'); writer.endDocument(); } catch(e){ _dump(e); }}]]> </xp:this.afterRenderResponse> </xp:view> =========================== XAgent END ========================================= The XAgent uses a ViewNavigator for fast retrieval of the column entries. The real magic is the use of java.lang.StringBuilder() to concat the view entries. A stringBuilder is the fastest way to concat a large number of strings. It is faster than just to use string1 + string2 UPDATE: Here is an enhancement, if you want to fetch the column values with Java public class ViewColumn { private static final String MSG_STRING_ERROR = "ERROR: "; private static final String MSG_STRING_NOT_FOUND = " not found"; public ViewColumn() { } public String getViewColumnValueJSON(String viewname, int pos) { ViewNavigator nav = null; StringBuilder json = new StringBuilder(); json.append('['); String strValue = ""; try { View view = getCurrentDatabase().getView(viewname); if (null != view) { view.setAutoUpdate(false); nav = view.createViewNav(); nav.setEntryOptions(ViewNavigator.VN_ENTRYOPT_NOCOUNTDATA); nav.setBufferMaxEntries(400); ViewEntry entry = nav.getFirst(); while (entry != null) { json.append( entry.getColumnValues().elementAt(pos).toString()); ViewEntry tmpentry= nav.getNext(entry); entry.recycle(); entry = tmpentry; } strValue = json.toString(); strValue = strValue.substring(0, strValue.lastIndexOf(",")) + "]"; view.setAutoUpdate(true); } else { System.out.println(MSG_STRING_ERROR + viewname + MSG_STRING_NOT_FOUND); } } catch (NotesException e) { System.out.println(MSG_STRING_ERROR); strValue = "[{}]"; } return strValue; } }