Quando si esegue lo streaming di JSON agli utenti finali, ciascun buffer dovrebbe essere indipendente JSON?

-1

Se trasmettevi JSON in streaming all'utente finale e ogni "buffer" di risposta era nel formato di, ad esempio ...

{ "something": "here", "other": 1}

Saresti in un punto in cui l'intero flusso insieme sarebbe simile a questo ...

{ "something": "here", "other": 1}{ "something": "else", "other": 2}

Quindi l'intera risposta ricostruita non è in realtà un JSON valido. Che cosa fanno di solito le persone in questa istanza?

Grazie in anticipo!

    
posta Thomas Stringer 25.10.2018 - 18:06
fonte

4 risposte

4

JSON non è realmente un formato streamable, ma puoi racchiudere i documenti JSON in un altro formato. Molto spesso, questo è solo un documento JSON per riga (c.f. link ). Questo è super facile da usare, ma pone alcune restrizioni sulla generazione JSON, in particolare che ogni documento non deve contenere letterline nuove.

La tua soluzione in cui i documenti sono direttamente adiacenti è tecnicamente valida perché i documenti JSON consistono sempre in un oggetto o array di livello superiore, ma questo ha alcune difficoltà nella pratica: o hai bisogno di un parser che può restituire la posizione di ogni "junk finale" "Questo non fa parte del primo documento, o hai bisogno di un lexer per dividere il flusso nelle posizioni corrette. Jsonlines lo evita introducendo un separatore esplicito, facile da trovare (l'interruzione di riga).

    
risposta data 25.10.2018 - 23:31
fonte
1

Se invii più blob di JSON ben formati, dovrai mettere un separatore tra loro in modo che il destinatario sappia dove finisce un blob e inizia il successivo. Ovviamente questo non rispetterà lo standard, perché ECMA 404 non prevede nulla come quello. Fortunatamente, l'IETF è intervenuto e ha adottato RFC 7464 come un modo per gestirlo. Definisce un flusso come un gruppo di record delimitati all'inizio da un carattere separatore del record (ASCII RS o 0x1e ) e alla fine da un avanzamento riga (ASCII LF o 0x0a ).

Come lo dividi dipende da te, ma suggerirei di inserire un numero sufficiente di dati in ogni blob in modo che il programma ricevente possa verificare che stia ottenendo tutto e sappia dove finiscono i dati:

<RS>
{ "id": 123, "giant-array": null, ... }
<LF>
<RS>
{ "id": 123, "part": 1, "giant-array": [ 1, 2, 3, ... ] }
<LF>
<RS>
{ "id": 123, "part": 2, "giant-array": [ 101, 102, 103, ... ] }
<LF>
... etc. ...
<RS>
{ "id": 123, "part": 2, "giant-array": null }
<LF>
    
risposta data 26.10.2018 - 14:30
fonte
0

I parser JSON si aspettano documenti JSON completi e corretti e si rifiutano di analizzare qualsiasi altra cosa. E i documenti JSON possono contenere caratteri quasi arbitrari.

Dato n documenti validi, puoi facilmente creare un array di n elementi. Se il ricevitore deve dividere ciò che riceve nei documenti, quindi separare il JSON di nul caratteri (ASCII 0), perché nessun documento JSON valido può contenere un carattere nul.

    
risposta data 26.10.2018 - 10:04
fonte
0

Linee JSON (anche JSONL ) è uno standard ben noto e documentato per lo streaming di dati come una serie di JSON "record" :

  • Un oggetto JSON valido per riga, delimitato da un newline e terminante in EOF.

È supportato nativamente in ambienti che supportano sia JSON che stream delimitati da newline, e ci sono librerie specifiche che lo supportano in molte lingue.

Nel caso in cui descrivi, devi solo affermare che il formato del vapore è JSONL .

    
risposta data 28.10.2018 - 02:04
fonte

Leggi altre domande sui tag