Draft: draft-ietf-jsonpath-base

Commentary: JSON types are not used much in the  spec . It is debatable whether there really is a boolean type or simply the values and . Also , the JSONPath spec does n't really benefit from this term . 
 I think this reads well without breaking any semantics .
Paragraph (version A):
The terminology of RFC8259 applies except where clarified below.  The
terms "Primitive" and "Structured" are used to group the types as in
RFC8259; JSON Objects and Arrays are structured, all other types are
primitive.  Definitions for "Object", "Array", "Number", and "String"
remain unchanged.  Importantly "object" and "array" in particular do
not take on a generic meaning, such as they would in a general
programming context.
Paragraph (version B):
The terminology of RFC8259 applies except where clarified below.  The
terms "Primitive" and "Structured" are used to group different kinds
of values as in RFC8259; JSON Objects and Arrays are structured, all
other values are primitive.  Definitions for "Object", "Array",
"Number", and "String" remain unchanged.  Importantly "object" and
"array" in particular do not take on a generic meaning, such as they
would in a general programming context.
Paragraph (version A):
Next, ".a" selects from any input node of type object and selects the
node of any member value of the input node corresponding to the
member name ""a"".  The result is again a list of one node:
"[{"b":0},{"b":1},{"c":2}]".
Paragraph (version A):
Next, "[*]" selects from an input node of type array all its elements
(if the input node were of type object, it would select all its
member values, but not the member names).  The result is a list of
three nodes: "{"b":0}", "{"b":1}", and "{"c":2}".
Paragraph (version A):
Finally, ".b" selects from any input node of type object with a
member name "b" and selects the node of the member value of the input
node corresponding to that name.  The result is a list containing
"0", "1".  This is the concatenation of three lists, two of length
one containing "0", "1", respectively, and one of length zero.
Paragraph (version B):
Next, ".a" selects from any object input node and selects the node of
any member value of the input node corresponding to the member name
""a"".  The result is again a list of one node:
"[{"b":0},{"b":1},{"c":2}]".
Paragraph (version B):
Next, "[*]" selects from any array input node all its elements (for
an object input node, it would select all its member values, but not
the member names).  The result is a list of three nodes: "{"b":0}",
"{"b":1}", and "{"c":2}".
Paragraph (version B):
Finally, ".b" selects from any object input node with a member name
"b" and selects the node of the member value of the input node
corresponding to that name.  The result is a list containing "0",
"1".  This is the concatenation of three lists, two of length one
containing "0", "1", respectively, and one of length zero.
Paragraph (version A):
In what follows, the semantics of each segment are defined for each
type of input node.
Paragraph (version B):
In what follows, the semantics of each segment are defined for each
kind of input node.
Paragraph (version A):
of their array elements or member values, respectively.  Applied to
other value types, it will select nothing.
Paragraph (version B):
of their array elements or member values, respectively.  Applied to
primitive values, it will select nothing.
Paragraph (version A):
values of the same primitive type (numbers, strings, booleans,
and "null") which are equal,
Paragraph (version B):
equal primitive values,