All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.minidev.json.actions.PathsRetainer Maven / Gradle / Ivy

Go to download

JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language.

There is a newer version: 2.5.1
Show newest version
package net.minidev.json.actions;

import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import net.minidev.json.actions.path.DotDelimiter;
import net.minidev.json.actions.path.PathDelimiter;
import net.minidev.json.actions.traverse.JSONTraverseAction;
import net.minidev.json.actions.traverse.JSONTraverser;
import net.minidev.json.actions.traverse.LocatePathsJsonAction;
import net.minidev.json.actions.traverse.RetainPathsJsonAction;

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * Retains branches of nodes of a {@link JSONObject} matching the list of user-specified paths.
 * 

* A path to copy must be specified in the n-gram format - a list of keys from the root down separated by dots: * K0[[[[.K1].K2].K3]...] *
* A key to the right of a dot is a direct child of a key to the left of a dot. Keys with a dot in their name are * not supported. *

* Example: *

* to retain the field k1.k2 in the {@link JSONObject} {k1:{k2:v1}, k3:{k4:v2}} instantiate the retainer like so: * new JSONObjectCleaner("k1.k2") * The resulting object would be {k1:{k2:v1}} *

* See unit tests in JSONObjectRetainerTest for more examples * * @author [email protected] */ public class PathsRetainer { protected List pathsToRetain; protected PathDelimiter pathDelimiter = new DotDelimiter().withAcceptDelimiterInNodeName(false); public PathsRetainer(JSONArray pathsToRetain) { if (pathsToRetain == null || pathsToRetain.isEmpty()) { this.pathsToRetain = Collections.emptyList(); } else { this.pathsToRetain = new LinkedList(); for (Object s : pathsToRetain) { this.pathsToRetain.add((String) s); } } } public PathsRetainer(List pathsToRetain) { this.pathsToRetain = pathsToRetain == null || pathsToRetain.size() == 0 ? Collections. emptyList() : pathsToRetain; } public PathsRetainer(String... pathsToRetain) { this.pathsToRetain = pathsToRetain == null || pathsToRetain.length == 0 ? Collections. emptyList() : new LinkedList(Arrays.asList(pathsToRetain)); } public PathsRetainer with(PathDelimiter pathDelimiter) { this.pathDelimiter = pathDelimiter; return this; } @SuppressWarnings("unchecked") public JSONObject retain(JSONObject object) { /** * a path to retain which contains a path in the object, but is not itself a path in the object, * will cause the sub-path to be retained although it shouldn't: * object = {k0:v0} retain = {k0.k1} * so the false path to retain has to be removed from the pathsToRetain list. * * The {@link LocatePathsJsonAction} returns only paths which exist in the object. */ JSONTraverseAction locateAction = new LocatePathsJsonAction(pathsToRetain, pathDelimiter); JSONTraverser t1 = new JSONTraverser(locateAction); t1.traverse(object); List realPathsToRetain = (List) locateAction.result(); //now reduce the object using only existing paths JSONTraverseAction retainer = new RetainPathsJsonAction(realPathsToRetain, pathDelimiter); JSONTraverser t2 = new JSONTraverser(retainer).with(pathDelimiter); t2.traverse(object); return (JSONObject) retainer.result(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy