【追記1】
Java 17では Script Engine の除外にともない、この技は利用できません.
この記事が必要な方はもうしばらく Java 8 だと思いますが。。
【追記2】
2025年追記: Java 11 において JavaScript Engine は非推奨になっており、Java 15 では削除されていますので、この記事は完全に過去のものです。
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]);
}
}
}
}