Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
82d83fe
Added few handy methods (smth like "builder pattern").
kirilldev Jan 2, 2016
1a0cf3e
introduce helper classes to process a JSONObject and its nodes
erav Apr 5, 2016
2d42e34
gitignore intellij idea files
erav Apr 5, 2016
909c53c
rename actions
erav Apr 17, 2016
38f9a53
add ElementRemover
erav Apr 17, 2016
92adc26
enhance traversal API
erav Jun 6, 2016
4de36a4
support any delimiter in traverser
erav Jun 7, 2016
efb8714
simplif api
erav Jun 8, 2016
5391eff
create tree navigator
erav Jun 19, 2016
1649130
house cleaning
erav Jun 19, 2016
ad93cc5
finalize tree navigator
erav Jun 21, 2016
8745243
Merge pull request #24 from erav/master
UrielCh Sep 24, 2016
5c3baae
Setp 1 unify code format + fix invalide java filename
UrielCh Sep 24, 2016
83e8aea
remove executable flad on java files
UrielCh Sep 24, 2016
7447287
reformat
UrielCh Sep 24, 2016
6eb2670
make test unit more readable
UrielCh Sep 24, 2016
eacbfb9
smal improvement
UrielCh Sep 24, 2016
b5c2da1
move action to json-smart-action
UrielCh Sep 24, 2016
9bd4b28
fix pom error
UrielCh Sep 24, 2016
1a11a47
change version and timeZone in pom
UrielCh Sep 24, 2016
d44241c
Merge pull request #31 from netplex/erav
UrielCh Sep 24, 2016
8aa02c8
Merge remote-tracking branch 'origin/v2.3' into pr/21
UrielCh Sep 24, 2016
dc4fbfb
Merge pull request #32 from netplex/pr/21
UrielCh Sep 24, 2016
6ba8c86
Remove the inlined ASM dependency in smart-accessors
mattnelson Oct 21, 2016
d4844f2
Merge pull request #35 from mattnelson/master
UrielCh Nov 3, 2016
ecf46cd
retro merge (@_@)'
UrielCh Mar 25, 2017
404baea
update README
UrielCh Mar 25, 2017
8653fa0
fix issue 33
UrielCh Mar 25, 2017
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add ElementRemover
  • Loading branch information
erav committed Apr 17, 2016
commit 38f9a537bb4d7a93f4b63d21b4703de1f0779f05
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package net.minidev.json.actions;

import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import net.minidev.json.actions.traverse.JSONTraverser;
import net.minidev.json.actions.traverse.RemoveElementsAction;
import net.minidev.json.actions.traverse.TraverseAction;

import java.util.*;

/**
* <b>Removes key:value elements from every node of a {@link JSONObject} matching the list of user-specified elements.</b>
* <p>
* An element to remove must be specified as a key:value pair
* <p>
* <b>Usage Example:</b>
* <p>
* To remove the element k2:v2 from the {@link JSONObject} {k0:{k2:v2, k3:v3}, k1:{k2:v2, k4:v4}} use the remover like so:
* <pre>
* PathRemover pr = new PathRemover("k2.v2");
* JSONObject cleanObject = pr.remove(new JSONObject(...));
* </pre>
* The resulting object 'cleanObject' would be {k0:{k3:v3}, k1:{k4:v4}}
* <p>
* See unit tests for more examples
*
* @author adoneitan@gmail.com
*
*/
public class ElementRemover
{
private Map<String, Object> elementsToRemove;

public ElementRemover(Map<String, Object> elementsToRemove)
{
this.elementsToRemove = elementsToRemove == null ? Collections.<String, Object>emptyMap() : elementsToRemove;
}

public ElementRemover(JSONObject elementsToRemove)
{
this.elementsToRemove = elementsToRemove == null ? Collections.<String, Object>emptyMap() : elementsToRemove;
}

public JSONObject remove(JSONObject objectToClean)
{
TraverseAction strategy = new RemoveElementsAction(this.elementsToRemove);
JSONTraverser traversal = new JSONTraverser(strategy);
traversal.traverse(objectToClean);
return (JSONObject) strategy.result();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package net.minidev.json.actions.traverse;

import net.minidev.json.JSONObject;

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

/**
* <b>Removes key:value elements from a {@link JSONObject}.</b>
* <p>
* An element is not removed from the user-specified list once its processing is over,
* because it may appear in more than one node.
* <p>
* See package-info for more details
* <p>
* See unit tests for examples
*
* @author adoneitan@gmail.com
*
*/
public class RemoveElementsAction implements TraverseAction
{
protected JSONObject result;
protected final Map<String, Object> elementsToRemove;
protected final boolean allowDotChar;

public RemoveElementsAction(Map<String, Object> elementsToRemove, boolean allowDotChar)
{
this.elementsToRemove = elementsToRemove;
this.allowDotChar = allowDotChar;
}

public RemoveElementsAction(Map<String, Object> elementsToRemove)
{
this(elementsToRemove, false);
}

@Override
public boolean handleStart(JSONObject object)
{
result = object;
return object != null && elementsToRemove != null && elementsToRemove.size() > 0;
}

@Override
public boolean handleDotChar() {
return allowDotChar;
}

@Override
public boolean handleEntryAndIgnoreChildren(String pathToEntry, Iterator<Map.Entry<String, Object>> it, Map.Entry<String, Object> entry)
{
if (elementsToRemove.entrySet().contains(entry))
{
it.remove();
}
return false;
}

@Override
public boolean handleNext()
{
//must traverse the whole object
return true;
}

@Override
public boolean handleJSONObjectChild() {
return true;
}

@Override
public boolean handleJSONArrayChild() {
return true;
}

@Override
public void handleEnd() {
//nothing to do
}

@Override
public Object result() {
return result;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package net.minidev.json.test.actions;

import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import net.minidev.json.JSONValue;
import net.minidev.json.actions.ElementRemover;
import net.minidev.json.parser.ParseException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.*;

import static org.junit.Assert.assertEquals;

/**
* Tests {@link ElementRemover}
*
* @author adoneitan@gmail.com
*/
@RunWith(Parameterized.class)
public class ElementRemoverTest
{
private String jsonToClean;
private String elementsToRemove;
private String expectedJson;

public ElementRemoverTest(String jsonToClean, String elementsToRemove, String expectedJson)
{
this.jsonToClean = jsonToClean;
this.elementsToRemove = elementsToRemove;
this.expectedJson = expectedJson;
}

@Parameterized.Parameters
public static Collection params()
{
return Arrays.asList(new Object[][]{

{"{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}", null, "{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}"},
{"{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}", "{}", "{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}"},
{"{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}", "{\"k0\":\"v2\"}", "{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}"},
{"{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}", "{\"k2\":\"v2\"}", "{\"k0\":{},\"k1\":{\"k3\":\"v3\"}}"},
{"{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}", "{\"k0\":{\"k2\":\"v2\"}}", "{\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}"},
{"{\"k0\":{\"k2\":\"v2\"},\"k1\":{\"k2\":\"v2\",\"k3\":\"v3\"}}", "{\"k2\":\"v2\",\"k3\":\"v3\"}", "{\"k0\":{},\"k1\":{}}"},
{"{\"k0\":{}}", "{}", "{\"k0\":{}}"},
});
}

@Test
public void test() throws ParseException
{
JSONObject objectToClean = jsonToClean != null ? (JSONObject) JSONValue.parseWithException(jsonToClean) : null;
JSONObject expectedObject = expectedJson != null ? (JSONObject) JSONValue.parseWithException(expectedJson): null;
JSONObject toRemove = elementsToRemove != null ? (JSONObject) JSONValue.parseWithException(elementsToRemove): null;
ElementRemover er = new ElementRemover(toRemove);
er.remove(objectToClean);
assertEquals(expectedObject, objectToClean);
}

// private ElementRemover switchKeyToRemove()
// {
// long m = System.currentTimeMillis();
// if (elementsToRemove == null && m % 4 == 0)
// {
// System.out.println("cast to String");
// return new ElementRemover((String)null);
// }
// else if (elementsToRemove == null && m % 4 == 1)
// {
// System.out.println("cast to String[]");
// return new ElementRemover((String[])null);
// }
// else if (elementsToRemove == null && m % 4 == 2)
// {
// System.out.println("cast to JSONArray");
// return new ElementRemover((JSONArray)null);
// }
// else if (elementsToRemove == null && m % 4 == 3)
// {
// System.out.println("cast to List<String>");
// return new ElementRemover((List<String>)null);
// }
// else if (elementsToRemove instanceof String)
// {
// return new ElementRemover((String) elementsToRemove);
// }
// else if (elementsToRemove instanceof String[])
// {
// return new ElementRemover((String[]) elementsToRemove);
// }
// else if (elementsToRemove instanceof JSONArray)
// {
// return new ElementRemover((JSONArray) elementsToRemove);
// }
// else if (elementsToRemove instanceof List<?>)
// {
// return new ElementRemover((List<String>) elementsToRemove);
// }
// else
// {
// throw new IllegalArgumentException("bad test setup: wrong type of key to remove");
// }
// }

}