woshidan's loose leaf

ぼんやり勉強しています

型が指定できないフォーマットのデータに入っている値の型を信用しない。フォールバック処理をデフォルトで動くからで止めずに確認する

こないだ、JavaScriptのコードからJavaのコードへ値を引き渡すとき、JSONの文字列にして渡すことがありまして。

そのときに受けたレビューで、Javaが期待している型が String だけど、JavaScriptからは Array だって Int だって入れられるのでは、という指摘があってなるほどーと思ったのでメモ。

TL;DR

  • 違う型に変換するときは、パースが通る/期待していた通りの型に変換されていることまでは意識がいっていた
  • 異なる言語から、型が指定できないフォーマットで値を受け取るときは、相手がこちらが期待していない型で入力していた場合の振る舞いについて考慮が必要
    • defaultで変換してくれるクラスがあったりすると、上記の仕様のことを忘れやすい

状況説明

どう言う感じかと言うと、

var url = 'woshidan://example?data=' + JSON.stringify({ data: [1, 2, 3]}); // この
$.get(url);

と書いたら、

String requestUri; // = "{ \"data\" : [1, 2, 3]}";
JSONObject requestJSON = new JSONObject(requestUri); 

みたいな感じになる場合、JavaScript書いた人は ArrayJavaへ送ったと思っていそうですよね。

でも、Java側で getString() してしまうと、

"[1, 2, 3]"

というString型の値が取れてしまう。

ここで、想定外の型(Array )が来てもなんでもStringに直すようにするのか、それともそこでこのキーは String 型しか入らないんですが、 Array 型入れてるのはなんでですかね、みたいにメッセージ出すか、みたいなことが考えられるといいですね。