json-pointer icon indicating copy to clipboard operation
json-pointer copied to clipboard

An option for .get to return undefined instead of throwing if pointer does not exist

Open epoberezkin opened this issue 9 years ago • 6 comments

@manuelstofer what do you think? Or you prefer that users just try/catch?

epoberezkin avatar Feb 17 '16 23:02 epoberezkin

I'm ok with returning undefined instead of throwing an exception. We should increase the version and add a note about backwards compatibility

manuelstofer avatar Feb 22 '16 15:02 manuelstofer

I think breaking backward compatibility is not a good idea, given how many packages use json-pointer. I already have tests that expect this exception. I think others will have a problem too, even if it's a major version change.

I would look at the option(s) in get, set, remove and api methods. I will think a bit and suggest something.

epoberezkin avatar Feb 22 '16 17:02 epoberezkin

Throwing error is really annoying. I think add a new option is just for backward compatibility, e.g.

api.get = function get (obj, pointer, silent) {
  .....
  if(!silent) throw new Error('Invalid reference token: ' + tok);
  ....
}

For old code, silent===undefined, and will throw error; For new code, author can pass silent=true, and get undefined.

It's the same for get, remove, parse.

Hoping a version bump!

futurist avatar Jun 03 '16 09:06 futurist

Having to deal with thrown errors is not ideal for performance or brevity, nor necessarily is the vagueness of getting undefined and not knowing if the content did not exist or existed with value undefined.

However users have the necessary power as-is to efficiently provide the desired behavior for themselves. If you want silent failure, just write a wrapper function incorporating api.has():

function safeGet(obj, pointer) {
    return api.has(obj, pointer)
        ? api.get(obj, pointer)
        : undefined;
}

I'm not sure that adding bloat to the underlying library is warranted.

evan-king avatar Nov 21 '16 00:11 evan-king

@evan-king The reason to add something to the library is performance - the pointer in the wrapper above will be parsed and processed twice.

epoberezkin avatar Nov 21 '16 21:11 epoberezkin

I would prefer if get does not throw an error in case the property does not exist... As well as for performance and practical reasons. I also think that this is a case that happens quite a lot, and therefore is not an exceptional case (as throwing an exception should be).

danrot avatar May 08 '19 11:05 danrot