tidwall / sjson

Set JSON values very quickly in Go

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Feature request - allow sets via array accessors

codingconcepts opened this issue · comments

It'd be really handy to be able to set fields using the following array syntax in the same way gjson allows for gets via the syntax:

body := `{
	"people": [
		{ "id": 1, "name": "alice" },
		{ "id": 2, "name": "bob" }
	]
}`

body, err := sjson.Set(body, `people.#[id="1"].name`, "carol")
if err != nil {
	log.Fatal(err)
}

fmt.Println(body)

Is this something that could be added to the library?

I'm here for similar. Would like to be able to use wildcard * for setting (it could set all matches, but I'd anticipate only one).

I agree that this would make for a very good enhancement. Unfortunately my schedule Is pretty backed up and it may take sometime before I can get to this feature, but I would be happy to get some help.

+1. Needs that

Or gjson adds something like path = gjson.GetPath(xx, searchpattern) which would be used in sjson.Set(xx, path, ..)

+1

Thanks for creating and sharing sjson and gjson @tidwall. They are really useful libraries.

However, I've also hit a bit of a stumbling block because sjson doesn't support the same path syntax as gjson such as people.#.name or people.#[id=1].name as mentioned by @codingconcepts.

Alternatively, the suggestion by @qinst64 would help me too but perhaps the path could be a member of the gjson Result struct. This would mean when you use result.Array() on the result of people.#[id=%].name, you'd get the paths of each result, i.e. people.0.name and people.1.name

Just started using libraries and found out that sjson doesn't support the same path syntax as gjson. Is there a way at least to get an array index number from gjson result?

jeremy-carbonne - are you planning to submit a PR?

i've also bumped into the sjson limitation with setting array elements.
note it seems to work when the wildcard is at the leaf (e.g.: value[*]) but not when otherwise.

it also seems inconsistent with gjson which supports the wildcard.

p.s.
@tidwall , if this is simple enough to explain & you have the solution in your head, please share it - it will make it easier for anyone who finds some time & has enough justification :)