JSON strictness
This is a list of behavior that monerod's JSON parser allows, that Cuprate's JSON parser (serde_json) does not.
In general, monerod's parser is quite lenient, allowing invalid JSON in many cases.
Cuprate's (really, serde_json) JSON parser is quite strict, essentially sticking to
the JSON specification.
Cuprate also makes some decisions that are different than monerod, but are not necessarily more or less strict.
Missing closing bracket
monerod will accept JSON missing a final closing }.
Example:
curl \
http://127.0.0.1:18081/json_rpc \
-d '{"jsonrpc":"2.0","id":"0","method":"get_block_count"' \
-H 'Content-Type: application/json'
Trailing ending comma
monerod will accept JSON containing a final trailing ,.
Example:
curl \
http://127.0.0.1:18081/json_rpc \
-d '{"jsonrpc":"2.0","id":"0","method":"get_block_count",}' \
-H 'Content-Type: application/json'
Allowing - in fields
monerod allows - as a valid value in certain fields, not a string "-", but the character -.
The fields where this is allowed seems to be any field monerod does not explicitly look for, examples include:
jsonrpcidparams(where parameters are not expected)- Any ignored field
The JSON-RPC 2.0 specification does state that the response id should be null upon errors in detecting the request id, although in this case, this is invalid JSON and should not make it this far. The response will contain the default id: 0 in this case.
Example:
curl \
http://127.0.0.1:18081/json_rpc \
-d '{"jsonrpc":-,"id":-,"params":-,"IGNORED_FIELD":-,"method":"get_block_count"}' \
-H 'Content-Type: application/json'