On Tue, Dec 29, 2020 at 6:07 PM Amnon <amno...@gmail.com> wrote:

> *How do you know, if you don't check? FTR, it's not just about sending
> garbage, it's also about requests accidentally being truncated or just
> generally garbled.*
>
> json.NewDecoder(r.Body).Decode(&payload) will return an error if the
> request is garbled or truncated.
>

Only if it is garbled in such a way that it doesn't have a valid document
as a prefix.

The other nice thing about this code is that it composes nicely  with the
> context.
> net/http provides the body as a Reader. And json NewDecoder takes a
> reader. The two fit together nicely, without any need
> for adapters.
>

Yes, that's unfortunate. It suggests that it would be a good idea to do so,
leading to loads of incorrect code in the wild.

The API looks like it should be able to decode a large payload without
> allocating a large buffer to hold the bytes.
> Sadly this is not the way encoding/json is implemented.
>

I think the general wisdom is, that a decoded json value will be
asymptotically the same size as the json string representing it. So there
is at most a 2x overhead, which doesn't matter much in most practical
use-cases.

On Tuesday, 29 December 2020 at 16:31:58 UTC axel.wa...@googlemail.com
> wrote:
>
>> On Tue, Dec 29, 2020 at 5:17 PM Amnon <amn...@gmail.com> wrote:
>>
>>> I always use `json.NewDecoder(r.Body).Decode(&payload)`
>>>
>>
>> You shouldn't.
>>
>> The code is more succinct than reading the entire body into a buffer, and
>>> then unmarshalling it. And there is only one error to check.
>>>
>>
>> There is only one error to check, because you are ignoring one. Namely
>> this one:
>>
>> If I was super concerned about people sending trailing gibberish to my
>>> server, I could call `dec.Buffered()` to see
>>>
>>
>> if there was anything left after the json object. I generally have not
>>> seen people sending garbage after their requests.
>>>
>>
>> How do you know, if you don't check? FTR, it's not just about sending
>> garbage, it's also about requests accidentally being truncated or just
>> generally garbled.
>>
>> FWIW, if your concern is that the "read body and unmarshal" is two error
>> checks, one solution would be to add a helper that does it for you - which
>> you can then re-use. If that doesn't seem worth it because you would only
>> use it once - well, then I'd question if the one extra error check is
>> really that much of an issue.
>>
>> IMO, `Unmarshal` is simply the correct function to use and if I don't
>> have a good reason to make my software behave in strange ways in the
>> presence of bugs, I prefer not to do that. But YMMV, of course.
>>
>>
>>
>>> And it is not clear what the correct action in these case is. I
>>> generally will ignore it.
>>>
>>> On occasions that I need to consume very large json arrays in my
>>> backend, without consuming much memory,
>>> I sometimes do something like
>>>
>>> https://play.golang.org/p/Isw_3p7mR5-
>>>
>>> On Tuesday, 29 December 2020 at 10:51:23 UTC axel.wa...@googlemail.com
>>> wrote:
>>>
>>>> There is an important semantic difference between the two, which means
>>>> you almost never want to use a `Decoder`: `Unmarshal` is for parsing a
>>>> single json document, whereas a `Decoder` is for parsing a stream of
>>>> concatenated documents, like so: https://play.golang.org/p/4uiNyJlNIKh.
>>>> In particular, this means that using a `Decoder` silently drops trailing
>>>> data and might not detect erronous json:
>>>> https://play.golang.org/p/cuOAUnKCuEk
>>>> So, unless you specifically know that you have a stream of concatenated
>>>> json documents `Decoder` is not actually doing what you want.
>>>>
>>>> On Tue, Dec 29, 2020 at 11:37 AM Amit Saha <amits...@gmail.com> wrote:
>>>>
>>>>> On Tue, Dec 29, 2020 at 11:35 AM burak serdar <bse...@computer.org>
>>>>> wrote:
>>>>> >
>>>>> > On Mon, Dec 28, 2020 at 5:22 PM Amit Saha <amits...@gmail.com>
>>>>> wrote:
>>>>> > >
>>>>> > > Hi all, let's say I am a single large JSON object that I want to
>>>>> > > process in my HTTP server backend.
>>>>> > >
>>>>> > > I am trying to get my head around if there is any performance
>>>>> > > advantage - memory or CPU to use the json.NewDecoder()/Decode()
>>>>> > > mechanism versus the Unmarshal() function?
>>>>> >
>>>>> > Unmarshal uses the decoder for unmarshaling. Unless you are planning
>>>>> > to process the JSON object piece by piece using a decoder, the two
>>>>> are
>>>>> > identical in terms of performance.
>>>>>
>>>>> Thank you for confirming.
>>>>>
>>>>>
>>>>> >
>>>>> > >
>>>>> > > Thanks,
>>>>> > > Amit
>>>>> > >
>>>>> > > --
>>>>> > > You received this message because you are subscribed to the Google
>>>>> Groups "golang-nuts" group.
>>>>> > > To unsubscribe from this group and stop receiving emails from it,
>>>>> send an email to golang-nuts...@googlegroups.com.
>>>>> > > To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/golang-nuts/CANODV3%3DU2KRRkvAAEfYqRtCVtYnh2dmGreqePF8QXLo1PriSPw%40mail.gmail.com
>>>>> .
>>>>>
>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "golang-nuts" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to golang-nuts...@googlegroups.com.
>>>>>
>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/golang-nuts/CANODV3%3DpXGcHzhSmaLr3f911i2CCYb0_j8CGH7zKAZXd_xTD-A%40mail.gmail.com
>>>>> .
>>>>>
>>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to golang-nuts...@googlegroups.com.
>>>
>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/golang-nuts/e9a6f76d-17bb-40da-84b3-2b1b8d0f3b35n%40googlegroups.com
>>> <https://groups.google.com/d/msgid/golang-nuts/e9a6f76d-17bb-40da-84b3-2b1b8d0f3b35n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/9af4c4a2-0267-4ed7-9bf0-7cc7afd4029en%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/9af4c4a2-0267-4ed7-9bf0-7cc7afd4029en%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEg5-1aJ4-w5KHjG%3DGgwfQxhVQ%2BKmzLtruibZe1ad3W9w%40mail.gmail.com.

Reply via email to