Code utilisé lorsque vous souhaitez traiter Json avec uniquement des bibliothèques standard en Java (version améliorée) gson inutile

gson est également pratique, mais je l'ai trouvé gênant, comme ne pas pouvoir tracer plusieurs couches à la fois, donc je crée un tel outil. De plus, il y a de nombreuses raisons ennuyeuses pour lesquelles "je veux vraiment utiliser Gson dans le système XX, mais l'approbation interne est gênante".

Vous pouvez l'utiliser comme ça.

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"); // <-Je veux faire ça
		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]);
		}
	}
}

Voici le code source. N'hésitez pas à le copier ou à le modifier avant utilisation.


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]);
			}
		}
	}
}

Recommended Posts

Code utilisé lorsque vous souhaitez traiter Json avec uniquement des bibliothèques standard en Java (version améliorée) gson inutile
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
Lorsque vous souhaitez implémenter des tests de bibliothèque Java avec Spock en multi-module avec Gradle dans Android Studio 3
Comparaison des chaînes de version lorsque vous souhaitez brancher le traitement entre deux versions (implémentation Java)
La première chose à faire lorsque vous voulez être satisfait d'Heroku sur GitHub avec Eclipse sur Java
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
[Java] Je veux effectuer distinctement avec la clé dans l'objet
[Mots qui m'ont été écrits lorsque j'étais en première année ⑦] Ce que je veux que vous incluiez au moins avec l'extension Visual Studio Code
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
[Pour les débutants] Lorsque vous voulez dire que l'option JVM (-D) ne fonctionne pas avec la commande java -jar, ou que la bibliothèque est boguée.
Essayez d'ajouter du texte à une image avec Scala en utilisant la bibliothèque standard de Java
Code pour échapper aux chaînes JSON en Java
Lorsque vous souhaitez lier InputStream dans JDBI3
Une note quand vous voulez Tuple en Java
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Vous devez également spécifier l'hôte lors du débogage à distance avec Java 9 ou version ultérieure
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Comment implémenter UICollectionView avec du code uniquement dans Swift
[Java] Comment chiffrer avec le chiffrement AES avec une bibliothèque standard
Source utilisée pour obtenir l'URL de la source de redirection en Java
Différences de code lors de l'utilisation du système de longueur en Java
[Ruby + Rails] Lorsque vous souhaitez vous inscrire dans la liste de diffusion de Mailchimp avec l'enregistrement de l'utilisateur
En Java, je souhaite couper plusieurs caractères spécifiés uniquement du début et de la fin.
Comment écrire dans la classe Model lorsque vous souhaitez enregistrer des données binaires dans DB avec PlayFramework
Lorsque vous souhaitez refléter les informations de la branche principale dans la branche actuelle sur laquelle vous travaillez actuellement
[Java] Modifier le traitement en fonction de la situation avec le modèle de stratégie
[Java] [jackson] Correspond à la virgule de fin (virgule de fin) lors de l'analyse de JSON.
Lorsque vous souhaitez écrire explicitement OR ou AND avec ransack
Publier le code de coupon utilisé sur le point de terminaison spécifié
Éléments à prendre en compte lors de l'écriture de code en Java
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Un mémo pour démarrer la programmation Java avec VS Code (version 2020-04)
docker-compose.yml lorsque vous voulez garder mysql en cours d'exécution avec docker
lombok.config lorsque vous voulez passer @Qualifier à @RequiredArgsConstructor avec lombok
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
[Swift] Lorsque vous voulez savoir si le nombre de caractères dans String correspond à un certain nombre ...
[Pour les super débutants] Les connaissances minimales que vous voulez garder à l'esprit avec les hachages et les symboles
Que faire lorsque vous souhaitez connaître la position source où la méthode est définie dans binding.pry