@@ -65,9 +65,17 @@ public class JsonPointer implements Serializable
65
65
/**
66
66
* We will retain representation of the pointer, as a String,
67
67
* so that {@link #toString} should be as efficient as possible.
68
+ *<p>
69
+ * NOTE: starting with 2.14, there is no accompanying
70
+ * {@link #_asStringOffset} that MUST be considered with this String;
68
71
*/
69
72
protected final String _asString ;
70
73
74
+ /**
75
+ * @since 2.14
76
+ */
77
+ protected final int _asStringOffset ;
78
+
71
79
protected final String _matchingPropertyName ;
72
80
73
81
protected final int _matchingElementIndex ;
@@ -88,21 +96,26 @@ protected JsonPointer() {
88
96
_matchingPropertyName = null ;
89
97
_matchingElementIndex = -1 ;
90
98
_asString = "" ;
99
+ _asStringOffset = 0 ;
91
100
}
92
101
93
102
// Constructor used for creating non-empty Segments
94
- protected JsonPointer (String fullString , String segment , JsonPointer next ) {
103
+ protected JsonPointer (String fullString , int fullStringOffset ,
104
+ String segment , JsonPointer next )
105
+ {
95
106
_asString = fullString ;
107
+ _asStringOffset = fullStringOffset ;
96
108
_nextSegment = next ;
97
109
// Ok; may always be a property
98
110
_matchingPropertyName = segment ;
99
111
// but could be an index, if parsable
100
112
_matchingElementIndex = _parseIndex (segment );
101
113
}
102
114
103
- // @since 2.5
104
- protected JsonPointer ( String fullString , String segment , int matchIndex , JsonPointer next ) {
115
+ protected JsonPointer ( String fullString , int fullStringOffset ,
116
+ String segment , int matchIndex , JsonPointer next ) {
105
117
_asString = fullString ;
118
+ _asStringOffset = fullStringOffset ;
106
119
_nextSegment = next ;
107
120
_matchingPropertyName = segment ;
108
121
_matchingElementIndex = matchIndex ;
@@ -199,11 +212,11 @@ public static JsonPointer forPath(JsonStreamContext context,
199
212
if (seg == null ) { // is this legal?
200
213
seg = "" ;
201
214
}
202
- tail = new JsonPointer (_fullPath (tail , seg ), seg , tail );
215
+ tail = new JsonPointer (_fullPath (tail , seg ), 0 , seg , tail );
203
216
} else if (context .inArray () || includeRoot ) {
204
217
int ix = context .getCurrentIndex ();
205
218
String ixStr = String .valueOf (ix );
206
- tail = new JsonPointer (_fullPath (tail , ixStr ), ixStr , ix , tail );
219
+ tail = new JsonPointer (_fullPath (tail , ixStr ), 0 , ixStr , ix , tail );
207
220
}
208
221
// NOTE: this effectively drops ROOT node(s); should have 1 such node,
209
222
// as the last one, but we don't have to care (probably some paths have
@@ -517,7 +530,13 @@ public JsonPointer head() {
517
530
/**********************************************************
518
531
*/
519
532
520
- @ Override public String toString () { return _asString ; }
533
+ @ Override public String toString () {
534
+ if (_asStringOffset <= 0 ) {
535
+ return _asString ;
536
+ }
537
+ return _asString .substring (_asStringOffset );
538
+ }
539
+
521
540
@ Override public int hashCode () { return _asString .hashCode (); }
522
541
523
542
@ Override public boolean equals (Object o ) {
@@ -605,9 +624,9 @@ protected static JsonPointer _parseTail(String fullPath)
605
624
606
625
private static JsonPointer _buildPath (String fullPath , String segment ,
607
626
PointerParent parent ) {
608
- JsonPointer curr = new JsonPointer (fullPath , segment , EMPTY );
627
+ JsonPointer curr = new JsonPointer (fullPath , 0 , segment , EMPTY );
609
628
for (; parent != null ; parent = parent .parent ) {
610
- curr = new JsonPointer (parent .fullPath , parent .segment , curr );
629
+ curr = new JsonPointer (parent .fullPath , 0 , parent .segment , curr );
611
630
}
612
631
return curr ;
613
632
}
@@ -669,7 +688,8 @@ protected JsonPointer _constructHead()
669
688
// and from that, length of suffix to drop
670
689
int suffixLength = last ._asString .length ();
671
690
JsonPointer next = _nextSegment ;
672
- return new JsonPointer (_asString .substring (0 , _asString .length () - suffixLength ), _matchingPropertyName ,
691
+ return new JsonPointer (_asString .substring (0 , _asString .length () - suffixLength ), 0 ,
692
+ _matchingPropertyName ,
673
693
_matchingElementIndex , next ._constructHead (suffixLength , last ));
674
694
}
675
695
@@ -680,7 +700,8 @@ protected JsonPointer _constructHead(int suffixLength, JsonPointer last)
680
700
}
681
701
JsonPointer next = _nextSegment ;
682
702
String str = _asString ;
683
- return new JsonPointer (str .substring (0 , str .length () - suffixLength ), _matchingPropertyName ,
703
+ return new JsonPointer (str .substring (0 , str .length () - suffixLength ), 0 ,
704
+ _matchingPropertyName ,
684
705
_matchingElementIndex , next ._constructHead (suffixLength , last ));
685
706
}
686
707
0 commit comments