いいね!数

0

閲覧数
474

いつもお世話になっております。

http://qa.xpages.jp/QA/qa.nsf/x_anspage.xsp?docId=2620B31A96A7A57B49258043003DE6AB

このページの続きの機能として、json形式にした値をxpagesで保存しています。

この後、ノーツクライアント側で該当文書を編集後に、再度xpagesで呼び出し及び開く時に、以下のことが起こります。

・json値を保存する時、そのフィールドの種類が「テキスト」の時

→エラーにならずに、開く。

・json値を保存する時、そのフィールドの種類が「リッチテキスト」の時

→エラーになってしまい、開くことができない。

上記編集する時には、該当フィールドを編集していなくても、保存後xpagesで開くとエラーになってしまいます。

 

実際には、以下のような感じです。

該当xpagesのpostOpenDocument部分で、json保存フィールドから、展開しています。

om.ibm.xsp.exception.EvaluationExceptionEx: JavaScript アクション式を実行中にエラーが発生しました
JavaScript アクション式を実行中にエラーが発生しました
スクリプトインタープリタエラー、行=8、列=21: JSON ストリングからの変換中にエラーが発生しました
JSON ストリングの構文解析中にエラーが発生しました
Lexical error at line 1, column 90. Encountered: "\r" (13), after : "\"\\u3042\\u3"

JavaScript コード

   1:  var item_list_value = document1.getItemValue("answerJson");
   2: 
   3:   if (item_list_value.isEmpty()) {
   4:     viewScope.item_list = [];
   5:   } else {
   6:     item_list_json = item_list_value[0];
   7:     var temp_json = '{"dummy":' + item_list_json + "}";
   8:     var item_list = fromJson(temp_json).dummy;
   9:     viewScope.item_list = item_list;
  10:   }

どうやら、改行コードがエラーっぽいのですが、何か回避策がありますでしょうか。

入力文字数の制限を避けたく、リッチテキストにしております。

また、json形式にした場合、ノーツクライアントで参照した時に、文字コードの問題から、入力されている文字列の判別がつかない問題もあり、これもなんとかしたいな、と思っております。

よろしくお願いいたします。

 

 

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:2017/01/22 18:19:26

回答・コメント

いいね!数

0

ご質問への直接の回答にならないかもしれませんが、自分も以前大量のJSONデータを文書保存させたいということでRichTextフィールドへのRead/Writeが必要で調べたことがあります。
自分の場合、以下のようにcom.ibm.xsp.http.MimeMultipart.fromHTMLを利用することでJSONを正しく保存、取得ができました。

	<xp:inputTextarea id="CanvasJson" value="#{document1.rtfield}"
	style="width:500px; height:500px; display: none;">
	    <xp:this.converter>
	        <xp:customConverter getAsString="#{javascript:value.getContentAsText()}">
	            <xp:this.getAsObject><![CDATA[#{javascript:com.ibm.xsp.http.MimeMultipart.fromHTML(value)}]]></xp:this.getAsObject>
	        </xp:customConverter>
	    </xp:this.converter>
	</xp:inputTextarea>

 

 

求めていた回答とずれていたらすみません。

回答日時:2017/01/23 9:58:37

いいね!数

0

> どうやら、改行コードがエラーっぽいのですが、何か回避策がありますでしょうか。

fromJson()で処理する文字列から改行コードを取り除いてやればいいでしょう。リッチテキストフィールドって勝手に改行コード入れてくるからこまるんですよね。

temp_json = temp_json.replace(/\r|\n/g, "");  // ¥rと¥nを空文字に置き換え。gは正規表現の全部置き換えのオプション
var item_list = fromJson(temp_json);

もちろん、リッチテキストフィールドに保存するJson文字列にデータとしての改行コードが含まれないのが前提。

改行コードをデータとして保持したいなら、リッチテキストフィールドに文字列をセットするときに、改行コードをエスケープしておけばOK。

var temp_json = temp_json.replace('\r\n', '\\r\\n'); // ¥r¥nを¥¥r¥¥nに置き換え

もちろん、この方法はリッチテキストフィールドに"\\r\\n"という文字列がセットされるとうまくいきません。

このあたりが、Kazuさんの書き込みのMineMultipartが解決してくれないか期待してるんですが、いまいちこれの使い方が調べ切れません。これって改行コード付きの文字列もMIME形式の文字列に変換してくれたりするんでしょうか。

 

> json形式にした場合、入力されている文字列の判別がつかない

これ、私も苦労しました。toJson()の結果ってUTF16になるみたいで、Notesクライアントで設定データを確認したり、修正しようとしてもそのままじゃ読めないんですよね。

そういう場合は自作のJSON変換関数を作るのが手です。

https://github.com/ebi311/Jalapeno/blob/master/Code/ScriptLibraries/RitsCommon_JSS.jss

上記のライブラリは海老原さんが公開されてるものですが、この中の RITS.objectToJSON()がまさに欲しいやつです。これを使わせてもらえば、Notesクライアントでも読める状態で変換できます。

/Yac

回答日時:2017/01/23 22:38:15

いいね!数

0

Kazu Tatsukiさん、yac4423さん

ご回答ありがとうございます。

以下、私の今回の対応ですが・・・

サブ項目形式(json)での保存はやめる、です。

yac4423さんには、いろいろとご教示いただいたのですが、すみません。

json形式で保存している各項目の値をビューに表示する場合のハンドリングのしにくさから、

想定されるレコード数分のフィールドを用意する、という古典的な方法で実装することにしました。

今回得た知識は、今後に活かさせていただきたく思います。

yas4423さんの方法は、サブ項目として保存したい要件が、他のDBでもありますので、活用させていただきます。

yac4423さんの回答を「これで解決!」とさせていただきます。

(Kazu Tasukiさんも、色々とアドバイス含め、ありがとうございました。)

回答日時:2017/01/24 11:23:06

いいね!数

0

>>>
json形式で保存している各項目の値をビューに表示する場合のハンドリングのしにくさから、想定されるレコード数分のフィールドを用意する、という古典的な方法で実装することにしました。
<<<

このあたりはある方法に慣れると、劇的に作りやすくなります。以下のページで紹介してるので、ぜひ。

http://tech-notes.dyndns.org/domino/humcom/humcom_itemlist.html

この手の構造を持つデータをビューに出す場合は<xp:viewPanel>で扱うのは無理(JSONデータが格納されてるのはリッチテキストフィールドなので)。

<xp:viewPanel>相当の一覧ページを<xp:repeat>を駆使して作ると、各文書のJSONデータを格納してるフィールドにアクセスして、構造を持ったオブジェクトに変換してやることで、ビューなのに可変長の情報を表示する、なんてこともできます。

こういうのを一度作っておくと、意外とコードの再利用ができるので、一度時間をかけて作ってみてください。

/Yac

回答日時:2017/01/24 23:49:02