型が指定できないフォーマットのデータに入っている値の型を信用しない。フォールバック処理をデフォルトで動くからで止めずに確認する
こないだ、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書いた人は Array
をJavaへ送ったと思っていそうですよね。
でも、Java側で getString()
してしまうと、
"[1, 2, 3]"
というString
型の値が取れてしまう。
ここで、想定外の型(Array
)が来てもなんでもStringに直すようにするのか、それともそこでこのキーは String
型しか入らないんですが、 Array
型入れてるのはなんでですかね、みたいにメッセージ出すか、みたいなことが考えられるといいですね。