Java

JavaでJSONの型をチェックする方法

java_アイキャッチ

こんにちは!ゆーたろうです。

Java開発で、JSONの型によって処理を切り分ける必要が出ました。

その際にちょっと悩んだりしたので、備忘録を兼ねて記録していきます。

問題点

①文字数値でJSONが来た時も数値と判定されてしまう

②ダブル型が指数表記になってしまう

例えばこのようなJSONがあったとします。

{
	"result": [
		{
			"id": "NO_001",
			"value": "123.45"
		},
		{
			"id": "NO_002",
			"value": "we2"
		},
		{
			"id": "NO_003",
			"value": -123
		},
		{
			"id": "NO_004",
			"value": 123
		},
		{
			"id": "NO_005",
			"value": 2.25555555555555555555555555555987
		}
	]
}

この場合、以下のように判定させたいのです。

  • 1つ目:String型(文字列)
  • 2つ目:String型(文字列)
  • 3つ目:Int型(整数値)
  • 4つ目:Int型(整数値)
  • 5つ目:Double型(小数点)

案1:正規表現を使ってみる

Stringクラスのmatchesメソッドを使う」を参考に、正規表現でやってみました。

String value = String.valueOf(getValue(json_array.getJSONObject(j), "value");
if( value.matches("[+-]?(0|[1-9]+\\d*)(\\.\\d+)?") ){
	//数値です
}else{
	//文字です
}

と、このようにしてみました。

結果は、1つ目も数値型と判定されてしまいました。。

また、Stringに変換しているときに、指数表記になってしまい、7.77777E13987というようになってしまいます。

なので、Double型もEが入っていることで、String型になってしまいます。

これではいけません。。。

案2:Decimalを使って、指数表記を直してみる

「java 指数表記 戻す」と検索すると

というサイトが見つかりました。

しかし、これを使っても、指数表記(E)が出てしまいました。。。

小数点以下が多いのでしょうか?今回は時間がなかったので詳しく調べてませんが、とりあえず別の方法を探すことにしました。

案3:JSONの解析時に型はわかるのでは?と気づく

String型にgetValue()を使い取得していますが、JSONの値を取ってきたものに対してチェックするのではなく、そもそもJSONParseを通しているのだからその時点で判別できないかとハッと気づきました。

そこで、「java json 型チェック」として検索してみたところ、こんなことができるようです。

JSONObjectから値の型を確認する方法は?

instanceofを使うことで、今回私が実現したかった処理はできました!

解決方法:instanceofを使う

このように、instanceofを使います。

String value = String.valueOf(getValue(json.getJSONObject(j), "value"));

Object obj = result_array.getJSONObject(j).get("value");
	
if( obj instanceof Integer) {
	jsonType = "int";
	
}else if (obj instanceof Double) {
	jsonType = "double";
	
}else {
	jsonType = "String";
}

System.out.println(jsonType + "型/" + value);

すると、以下のような判定ができました。

2020-07-07 16:45:49.293 パッケージ名 - String型/123.45
2020-07-07 16:45:49.294 パッケージ名 - String型/we2
2020-07-07 16:45:49.294 パッケージ名 - int型/-123
2020-07-07 16:45:49.295 パッケージ名 - int型/123
2020-07-07 16:45:49.295 パッケージ名 - double型/2.2555555555555555

文字数値であっても文字として判定されますし、Double型も指数表記ではなくなっています。

※小数点が切り捨てられているのはDouble型の表現上の仕様ということで今回はこれで良いことになったので、切り捨てに関しては許容しています。

まとめ

  • JSONの値の型を調べたいときは「instanceofを使えばいい

何はともあれ、無事に実現できてよかったです。

ほんと、プログラミングって何でもできるんですね。ちょっと感動です。

参考サイト

こちらはAndroid用のドキュメントですが、今回の調査途中で見つけたのでメモしておきます。

チェックメソッドについて参考になるので、のぞいてみると面白いかもしれません。

取得時のデータ変換