LoginSignup
8
9

More than 1 year has passed since last update.

Java で Json を標準ライブラリだけで処理したいときに使うコード(改良版)gson 不要

Last updated at Posted at 2019-01-10

【追記1】
Java 17では Script Engine の除外にともない、この技は利用できません.
この記事が必要な方はもうしばらく Java 8 だと思いますが。。


gson も便利ですが、複数階層を一気に辿れないなど、面倒だと思いましたのでこのようなツールを作っています。
あと「XXシステムでGson使いたいのが本音だが社内の承認などが面倒」というつまらない理由も多いことでしょう。

*デスクトップ版で普及しているJVMには標準で「JavaScript Engine」が搭載されており、それを呼び出すことで実現しております。組み込み系では不可の可能性が高いです。

こんなふうに使えます。

public static void main(String[] args) {
String json = "{'test':'this is test','test2':{'test3':'value3'},'test4':['a','b','c']}";
	{
		Object value = JsonUtil.get(json, "test"); // <- 
		System.out.println(value); // "this is test"
	}
	{
		Object value = JsonUtil.get(json, "test2.test3"); // <- これをやりたい
		System.out.println(value); // "value3"
	}
	{
		Object[] value = JsonUtil.getAsArray(json, "test4");
		System.out.println(Arrays.toString(value)); // ["a","b","c"]
		System.err.println(value.getClass());
		for (int n = 0; n < value.length; n++) {
			System.err.println(value[n]);
		}
	}
}

以下、ソースコードです。ご自由にコピペなり改造なりしてお使いください。


package pkg;

import java.util.Arrays;
import java.util.Map;
import java.util.Set;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JsonUtil {

	public static Object[] getAsArray(String json, String code) {
		Object obj = get(json, code);
		if (obj instanceof Object[]) {
			return (Object[]) obj;
		} else {
			return null;
		}
	}
	public static Object get(String json, String code) {
		// Get the JavaScript engine
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("JavaScript");

		String script = "var obj = " + json + ";";
		try {
			engine.eval(script);
			{
				Object obj = engine.eval("obj." + code);
				if (obj instanceof Map) {
					java.util.Map map = (java.util.Map) obj;
					Set entrySet = map.entrySet();
					Object[] arr = new Object[entrySet.size()];
					int n = 0;
					for (Object objValue : map.values()) {
						if (objValue instanceof String) {
							String sValue = (String) objValue;
							arr[n] = sValue;
						} else {
							arr[n] = map.get(obj);
						}
						n++;
					}
					return arr;
				}
				return obj;
			}
		} catch (ScriptException e) {
			e.printStackTrace();
			return null;
		}
	}
	public static void main(String[] args) {
		String json = "{'test':'this is test','test2':{'test3':'value3'},'test4':['a','b','c']}";
		{
			Object value = JsonUtil.get(json, "test");
			System.out.println(value); // "this is test"
		}
		{
			Object value = JsonUtil.get(json, "test2.test3");
			System.out.println(value); // "value3"
		}
		{
			Object[] value = JsonUtil.getAsArray(json, "test4");
			System.out.println(Arrays.toString(value)); // ["a","b","c"]
			System.err.println(value.getClass());
			for (int n = 0; n < value.length; n++) {
				System.err.println(value[n]);
			}
		}
	}
}

8
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9