- Notifications
You must be signed in to change notification settings - Fork891
ParseBytes no longer copies data + added result.Bytes()#383
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:master
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
mirecl commentedAug 28, 2025
@tidwall , what do you think about this change? |
tidwall commentedAug 28, 2025
This PR breaks the rules of immutability for strings in Go. Using the change in this PR, run this code: json:= []byte(`{ "first": "Janet", "last": "Prichard" }`)first:=gjson.ParseBytes(json).Get("first").String()println(first)copy(json[11:18],`"Carol"`)println(first)// Output:// Janet// Carol It should not be possible to change the backed memory of a string, but in the example above the string This is because the A safer workaround would be to cast before parse, then immediately copy the result (which contains a mutable string), back into an immutable string. json:= []byte(`{ "first": "Janet", "last": "Prichard" }`)jsonStr:=*(*string)(unsafe.Pointer(&json))// cast []bytes to string, zero-copyfirst:=Parse(jsonStr).Get("first").String()// use Parse instead of ParseBytesfirst=string([]byte(first))// copy result back into stringprintln(first)copy(json[11:18],`"Carol"`)println(first)// Output:// Janet// Janet |
Summary
ParseBytes(json []byte) Resultnow uses thebytesStringhelper function (unsafe cast) overstring(...)conversion to avoid copying the byte slice.result.Bytes()helper was added to accessresult.Rawas[]bytewithout copying data.Motivation
This change aims at allowing the use of
[]byteoverstringas input when usinggjson without having to copy data or perform extra memory allocations, since one of the selling points of this library is its ability to parse and process JSON with no copy / zero allocations.