@@ -1522,9 +1522,15 @@ public static List<String> stringToPath(final String string) {
15221522 return result ;
15231523 }
15241524
1525+ private enum OperationType {
1526+ GET ,
1527+ SET ,
1528+ REMOVE
1529+ }
1530+
15251531 @ SuppressWarnings ("unchecked" )
1526- private static <T > T baseGetAndSet (final Map <String , Object > object , final String path ,
1527- final Optional < Object > value ) {
1532+ private static <T > T baseGetOrSetOrRemove (final Map <String , Object > object , final String path ,
1533+ final Object value , OperationType operationType ) {
15281534 final List <String > paths = stringToPath (path );
15291535 int index = 0 ;
15301536 final int length = paths .size ();
@@ -1552,11 +1558,17 @@ private static <T> T baseGetAndSet(final Map<String, Object> object, final Strin
15521558 index += 1 ;
15531559 }
15541560 if (index > 0 && index == length ) {
1555- if (value .isPresent ()) {
1561+ if (operationType == OperationType .SET ) {
1562+ if (savedLocalObject instanceof Map ) {
1563+ ((Map ) savedLocalObject ).put (savedPath , value );
1564+ } else {
1565+ ((List ) savedLocalObject ).set (Integer .parseInt (savedPath ), value );
1566+ }
1567+ } else if (operationType == OperationType .REMOVE ) {
15561568 if (savedLocalObject instanceof Map ) {
1557- ((Map ) savedLocalObject ).put (savedPath , value . get () );
1569+ ((Map ) savedLocalObject ).remove (savedPath );
15581570 } else {
1559- ((List ) savedLocalObject ).set (Integer .parseInt (savedPath ), value . get ( ));
1571+ ((List ) savedLocalObject ).remove (Integer .parseInt (savedPath ));
15601572 }
15611573 }
15621574 return (T ) localObject ;
@@ -1569,39 +1581,15 @@ private static Map.Entry getMapEntry(Map map) {
15691581 }
15701582
15711583 public static <T > T get (final Map <String , Object > object , final String path ) {
1572- return baseGetAndSet (object , path , Optional . absent () );
1584+ return baseGetOrSetOrRemove (object , path , null , OperationType . GET );
15731585 }
15741586
15751587 public static <T > T set (final Map <String , Object > object , final String path , Object value ) {
1576- return baseGetAndSet (object , path , Optional . of ( value ) );
1588+ return baseGetOrSetOrRemove (object , path , value , OperationType . SET );
15771589 }
15781590
1579- @ SuppressWarnings ("unchecked" )
1580- public static Map <String , Object > remove (final Map <String , Object > map , final String key ) {
1581- Map <String , Object > outMap = newLinkedHashMap ();
1582- for (Map .Entry <String , Object > entry : map .entrySet ()) {
1583- if (!entry .getKey ().equals (key )) {
1584- outMap .put (entry .getKey (), makeObjectForRemove (entry .getValue (), key ));
1585- }
1586- }
1587- return outMap ;
1588- }
1589-
1590- @ SuppressWarnings ("unchecked" )
1591- private static Object makeObjectForRemove (Object value , final String key ) {
1592- final Object result ;
1593- if (value instanceof List ) {
1594- List <Object > values = newArrayList ();
1595- for (Object item : (List ) value ) {
1596- values .add (item instanceof Map ? remove ((Map <String , Object >) item , key ) : item );
1597- }
1598- result = values ;
1599- } else if (value instanceof Map ) {
1600- result = remove ((Map <String , Object >) value , key );
1601- } else {
1602- result = value ;
1603- }
1604- return result ;
1591+ public static <T > T remove (final Map <String , Object > object , final String path ) {
1592+ return baseGetOrSetOrRemove (object , path , null , OperationType .REMOVE );
16051593 }
16061594
16071595 @ SuppressWarnings ("unchecked" )
@@ -2489,6 +2477,16 @@ public Builder set(final String path, final Object value) {
24892477 return this ;
24902478 }
24912479
2480+ public Builder remove (final String key ) {
2481+ U .remove (data , key );
2482+ return this ;
2483+ }
2484+
2485+ public Builder clear () {
2486+ data .clear ();
2487+ return this ;
2488+ }
2489+
24922490 public Builder add (final Builder builder ) {
24932491 data .put (String .valueOf (data .size ()), builder .build ());
24942492 return this ;
@@ -2555,6 +2553,16 @@ public ArrayBuilder set(final int index, final Object value) {
25552553 return this ;
25562554 }
25572555
2556+ public ArrayBuilder remove (final int index ) {
2557+ data .remove (index );
2558+ return this ;
2559+ }
2560+
2561+ public ArrayBuilder clear () {
2562+ data .clear ();
2563+ return this ;
2564+ }
2565+
25582566 public ArrayBuilder add (final ArrayBuilder builder ) {
25592567 data .addAll (builder .build ());
25602568 return this ;
0 commit comments