JsonUtils.java 3.22 KB
/*
 * Copyright Codecrew Ry
 *
 * All rights reserved.
 *
 * This license applies to any software containing a notice placed by the
 * copyright holder. Such software is herein referred to as the Software.
 * This license covers modification, distribution and use of the Software.
 *
 * Any distribution and use in source and binary forms, with or without
 * modification is not permitted without explicit written permission from the
 * copyright owner.
 *
 * A non-exclusive royalty-free right is granted to the copyright owner of the
 * Software to use, modify and distribute all modifications to the Software in
 * future versions of the Software.
 *
 */
package fi.codecrew.moya.utilities;

import java.util.List;
import java.util.Map;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonValue;
import javax.json.JsonValue.ValueType;

public class JsonUtils {

	/**
	 * Gets a sub object from a JsonObject. Returns an empty object if not
	 * found.
	 *
	 * @param jsonObject
	 * @param path
	 * @return
	 */
	public static JsonValue getSubObject(JsonObject jsonObject, List<String> path) {
		JsonValue sub = jsonObject;

		// Burrow into object hierarchy
		for (String s : path) {
			if (sub != null && sub.getValueType() == ValueType.OBJECT) {
				JsonObject subObject = (JsonObject) sub;
				sub = subObject.get(s);
			} else {
				// Trying to get sub-object of something not an object. Bad.
				sub = null;
				break;
			}
		}

		// If this thing does not exist, return an empty object.
		if (sub == null) {
			sub = Json.createObjectBuilder().build();
		}

		return sub;
	}

	/**
	 * Adds or alters one key in JsonObject
	 *
	 * @param jsonObject
	 * @param key        which key to add/alter
	 * @param value      The value associate to the key
	 * @return JsonObject with the key:value pair added
	 */
	public static JsonObject assocJsonObject(JsonObject jsonObject, String key, JsonValue value) {
		JsonObjectBuilder builder = Json.createObjectBuilder();

		// Copy all non conflicting json entries
		for (Map.Entry<String, JsonValue> v : jsonObject.entrySet()) {
			if (v.getKey().equals(key) == false) {
				builder = builder.add(v.getKey(), v.getValue());
			}
		}

		// Add our new json entry
		builder = builder.add(key, value);

		return builder.build();
	}

	/**
	 * Goes into a json object and sets subobject assocInJsonObject("{}",
	 * ["foo", "bar"], "{\"a\":\"b\"}") => {\"foo\":{\"bar\":{\"a\":\"b\"}}}
	 *
	 * @param jsonObject
	 * @param keys       path inside key hierarchy
	 * @param value
	 * @return JsonObject with the value added
	 */
	public static JsonObject assocInJsonObject(JsonObject jsonObject, List<String> keys, JsonValue value) {

		// Recurse?
		if (keys.size() > 1) {
			String firstKey = keys.get(0);
			List<String> restKeys = keys.subList(1, keys.size());
			JsonObject subObj = jsonObject.getJsonObject(firstKey);
			return assocJsonObject(jsonObject, firstKey,
				assocInJsonObject(subObj, restKeys, value));
		}

		// End?
		String firstKey = keys.get(0);
		return assocJsonObject(jsonObject, firstKey, value);
	}

	public static JsonObject alterSubObject(JsonObject jsonObject, List<String> path, JsonObject subObject) {
		return assocInJsonObject(jsonObject, path, subObject);
	}
}