You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/05-data-types/12-json/article.md
+51-49Lines changed: 51 additions & 49 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Metodi JSON, toJSON
2
2
3
-
Ipotizziamo di avere un oggetto complesso, che vogliamo convertire a stringa, per trasmetterlo in rete, o anche solo stamparlo su schermo per altri scopi.
3
+
Ipotizziamo di avere un oggetto complesso, che vogliamo convertire a stringa prima trasmetterlo in rete, o anche solo per mostrarlo sullo schermo.
4
4
5
5
Naturalmente, una stringa di questo tipo deve includere tutte le proprietà importanti.
6
6
@@ -21,7 +21,7 @@ let user = {
21
21
alert(user); // {name: "John", age: 30}
22
22
```
23
23
24
-
...Ma nel processo di sviluppo, potrebbero essere aggiunte/eliminate/rinominate nuove proprietà. Aggiornare costantemente la funzione `toString` non è una buona soluzione. Potremmo provare a iterare sulle proprietà dell'oggetto, ma cosa succede se l'oggetto contiene oggetti annidati? Dovremmo implementare anche questa conversione. E se dovessimo inviare l'oggetto in rete, dovremmo anche fornire il codice per poterlo "leggere".
24
+
...Ma nel processo di sviluppo, potrebbero essere aggiunte/eliminate/rinominate nuove proprietà. Aggiornare costantemente la funzione `toString` non è una buona soluzione. Potremmo provare a iterare sulle proprietà dell'oggetto, ma cosa succederebbe se l'oggetto contenesse oggetti annidati? Dovremmo implementare anche questa conversione. E se dovessimo inviare l'oggetto in rete, dovremmo anche fornire il codice per poterlo "leggere".
25
25
26
26
Fortunatamente, non c'è bisogno di scrivere del codice per gestire questa situazione.
27
27
@@ -34,7 +34,7 @@ JavaScript fornisce i metodi:
34
34
-`JSON.stringify` per convertire oggetti in JSON.
35
35
-`JSON.parse` per convertire JSON in oggetto.
36
36
37
-
Ad esempio, abbiamo `JSON.stringify` uno studente:
37
+
Ad esempio, abbiamo `JSON.stringify`per uno studente:
38
38
```js run
39
39
let student = {
40
40
name:'John',
@@ -48,7 +48,7 @@ let student = {
48
48
let json =JSON.stringify(student);
49
49
*/!*
50
50
51
-
alert(typeof json); // we've got a string!
51
+
alert(typeof json); //abbiamo una stringa!
52
52
53
53
alert(json);
54
54
*!*
@@ -70,8 +70,8 @@ La stringa `json` risultante viene chiamata *codifica in JSON* o *serializzata*,
70
70
71
71
Da notare che un oggetto codificato in JSON possiede delle fondamentali differenze da un oggetto letterale:
72
72
73
-
- Le stringhe utilizzano doppi apici. In JSON non vengono utilizzare backtick o singoli apici. Quindi `'John'` diventa `"John"`.
74
-
- Anche nomi delle proprietà dell'oggetto vengono racchiusi tra doppi apici. Quindi `age:30` diventa `"age":30`.
73
+
- Le stringhe utilizzano doppie virgolette. In JSON non vengono utilizzare backtick o singole virgolette. Quindi `'John'` diventa `"John"`.
74
+
- Anche i nomi delle proprietà dell'oggetto vengono racchiusi tra doppie virgolette. Quindi `age:30` diventa `"age":30`.
75
75
76
76
`JSON.stringify` può anche essere applicato agli oggetti primitivi.
77
77
@@ -88,10 +88,11 @@ I tipi che supportano nativamente JSON sono:
88
88
Ad esempio:
89
89
90
90
```js run
91
-
//a number in JSON is just a number
91
+
//un numero in JSON è solo un numero
92
92
alert( JSON.stringify(1) ) // 1
93
93
94
-
// a string in JSON is still a string, but double-quoted
94
+
// una stringa in JSON è ancora una stringa, ma con doppie virgolette
JSON.stringify(meetup); //Error: Converting circular structure to JSON
168
+
JSON.stringify(meetup); //Errore: conversione di struttura circolare a JSON
167
169
*/!*
168
170
```
169
171
170
-
In questo caso, la conversione fallisce, a causa del riferimento ciclico: `room.occupiedBy` fa riferimento a `meetup`, e `meetup.place` fa riferimento a `room`:
172
+
In questo caso, la conversione fallisce a causa del riferimento ciclico: `room.occupiedBy` fa riferimento a `meetup`, e `meetup.place` fa riferimento a `room`:
171
173
172
174

173
175
@@ -189,7 +191,7 @@ replacer
189
191
space
190
192
: Quantità di spazio da utilizzare per la formattazione
191
193
192
-
Nella maggior parte dei casi, `JSON.stringify` viene utilizzato solamente specificando il primo argomento. Ma se avessimo bisogno di gestire il processo di rimpiazzo, ad esempio filtrando i riferimenti ciclici, possiamo utilizzare il secondo argomento di `JSON.stringify`.
194
+
Nella maggior parte dei casi, `JSON.stringify` viene utilizzato specificando solamente il primo argomento. Ma se avessimo bisogno di gestire il processo di rimpiazzo, ad esempio filtrando i riferimenti ciclici, possiamo utilizzare il secondo argomento di `JSON.stringify`.
193
195
194
196
Se forniamo un array di proprietà, solamente quelle proprietà verranno codificate.
Quisiamo stati troppo stretti. La lista di proprietà viene applicata all'intera struttura dell'oggetto. Quindi `participants` risulta essere vuoto, perché `name`non è in lista.
217
+
Qui, probabilmente, siamo stati troppo rigidi. La lista di proprietà viene applicata all'intera struttura dell'oggetto. Quindi `participants` risulta essere vuoto, perché `name`non è in lista.
216
218
217
-
Andiamo ad includere ogni proprietà ad eccezione di `room.occupiedBy` che potrebbe causare un riferimento ciclico:
219
+
Andiamo ad includere ogni proprietà ad eccezione di `room.occupiedBy`, che potrebbe causare un riferimento ciclico:
Ora tutto ad eccezione di `occupiedBy` viene serializzato. Ma la lista di proprietà è piuttosto lunga.
244
+
Ora tutto, ad eccezione di `occupiedBy`, viene serializzato. Ma la lista di proprietà è piuttosto lunga.
243
245
244
-
Fortunatamente, possiamo utilizzare una funzione come `replacer`, piuttosto che un array.
246
+
Fortunatamente, possiamo utilizzare come `replacer` una funzione piuttosto di un array.
245
247
246
248
La funzione verrà invocata per ogni coppia `(key, value)` e dovrebbe ritornare il valore sostitutivo, che verrà utilizzato al posto di quello originale.
Da notare che la funzione `replacer` ottiene tutte le coppie key/value incluse quelle degli oggetti annidati. Viene applicata ricorsivamente. Il valore di `this` all'interno di `replacer` è l'oggetto che contiene la proprietà corrente.
284
+
Da notare che la funzione `replacer` ottiene tutte le coppie key/value, incluse quelle degli oggetti annidati. Viene applicata ricorsivamente. Il valore di `this` all'interno di `replacer` è l'oggetto che contiene la proprietà corrente.
283
285
284
-
La prima chiamata è speciale. Viene effettuata utilizzando uno speciale "oggetto contenitore": `{"": meetup}`. In altre parole, la prima coppia `(key, value)` possiede una chiave vuota, e il valore è l'oggetto stesso. Questo è il motivo per cui la prima riga risulta essere `":[object Object]"` nell'esempio sopra.
286
+
La prima chiamata è speciale. Viene effettuata utilizzando uno speciale "oggetto contenitore": `{"": meetup}`. In altre parole, la prima coppia `(key, value)` possiede una chiave vuota, e il valore è l'oggetto stesso. Questo è il motivo per cui la prima riga dell'esempio sopra risulta essere `":[object Object]"`.
285
287
286
-
L'idea è quella di fornire più potenza possibile a `replacer`: deve avere la possibilità di rimpiazzare/saltare l'oggetto per interno, se necessario.
288
+
L'idea è quella di fornire più potenza possibile a `replacer`: deve avere la possibilità di rimpiazzare/saltare l'oggetto stesso, se necessario.
287
289
288
290
## Formattazione: spacer
289
291
290
292
Il terzo argomento di `JSON.stringify(value, replacer, spaces)` è il numero di spazi da utilizzare per una corretta formattazione.
291
293
292
-
Tutti gli oggetti serializzati fino ad ora non possedevano un indentazione o spazi extra. Ci può andare bene se dobbiamo semplicemente inviare l'oggetto. L'argomento `spacer` viene utilizzato solo con scopo di abbellimento.
294
+
Tutti gli oggetti serializzati fino ad ora non possedevano una indentazione o spazi extra. Ci può andare bene se dobbiamo semplicemente inviare l'oggetto. L'argomento `spacer` viene utilizzato solo con lo scopo di abbellirlo.
293
295
294
296
In questo caso `spacer = 2` dice a JavaScript di mostrare gli oggetti annidati in diverse righe, con un indentazione di 2 spazi all'interno dell'oggetto:
/*for JSON.stringify(user, null, 4) the result would be more indented:
320
+
/*Per JSON.stringify(user, null, 4) il risultato sarebbe più indentato:
319
321
{
320
322
"name": "John",
321
323
"age": 25,
@@ -331,7 +333,7 @@ Il parametro `spaces` viene utilizzato unicamente per procedure di logging o per
331
333
332
334
## Modificare "toJSON"
333
335
334
-
Come per la conversione `toString`, un oggetto può fornire un metodo `toJSON` per la conversione verso JSON. Se questa è disponibile allora`JSON.stringify` la chiamerà automaticamente.
336
+
Come per la conversione `toString`, un oggetto può fornire un metodo `toJSON` per la conversione a JSON. Se questa è disponibile `JSON.stringify` la chiamerà automaticamente.
335
337
336
338
Ad esempio:
337
339
@@ -408,12 +410,12 @@ str
408
410
: stringa JSON da decodificare.
409
411
410
412
reviver
411
-
: funzione(key, value) che verrà chiamata per ogni coppia `(key, value)` e può rimpiazzare i valori.
413
+
: funzione(key, value) che verrà chiamata per ogni coppia `(key, value)` e che può rimpiazzare i valori.
412
414
413
415
Ad esempio:
414
416
415
417
```js run
416
-
//stringified array
418
+
// array serializzato
417
419
let numbers ="[0, 1, 2, 3]";
418
420
419
421
numbers =JSON.parse(numbers);
@@ -437,25 +439,25 @@ Alcuni errori tipici di scrittura in JSON (in qualche caso lo utilizzeremo per s
437
439
438
440
```js
439
441
let json =`{
440
-
*!*name*/!*: "John", // mistake: property name without quotes
441
-
"surname": *!*'Smith'*/!*, // mistake: single quotes in value (must be double)
442
-
*!*'isAdmin'*/!*: false // mistake: single quotes in key (must be double)
443
-
"birthday": *!*new Date(2000, 2, 3)*/!*, // mistake: no "new" is allowed, only bare values
444
-
"friends": [0,1,2,3] // here all fine
442
+
*!*name*/!*: "John", // errore: proprietà name without quotes
443
+
"surname": *!*'Smith'*/!*, // errore: singole virgolette in value (devono essere doppie)
444
+
*!*'isAdmin'*/!*: false // errore: singole virgolette in key (devono essere doppie)
445
+
"birthday": *!*new Date(2000, 2, 3)*/!*, // errore: "new" non è permesso
446
+
"friends": [0,1,2,3] // qui tutto bene
445
447
}`;
446
448
```
447
449
448
450
Inoltre, JSON non supporta i commenti. Quindi l'aggiunta di un commento invaliderebbe il documento.
449
451
450
-
Esiste un altro formato chiamato [JSON5](http://json5.org/), che accetta chiavi senza apici, commenti etc. Ma consiste in una libreria a se stante, non fa parte della specifica del linguaggio.
452
+
Esiste un altro formato chiamato [JSON5](http://json5.org/), che accetta chiavi senza virgolette, commenti etc. Ma consiste in una libreria a se stante, non fa parte della specifica del linguaggio.
451
453
452
454
Il JSON classico è cosi restrittivo non per pigrizia degli sviluppatori, ma per consentire una facile, affidabile e rapida implementazione degli algoritmi di analisi.
453
455
454
-
## Riportare in vita
456
+
## Ritrasformare in oggetto
455
457
456
458
Immaginate di ricevere dal server un oggetto `meetup` serializzato.
457
459
458
-
Assomiglia:
460
+
Come:
459
461
460
462
```js
461
463
// title: (meetup title), date: (meetup date)
@@ -480,7 +482,7 @@ Whoops! Errore!
480
482
481
483
Il valore di `meetup.date` è una stringa, non un oggetto di tipo `Date`. Come fa `JSON.parse` a sapere che dovrebbe trasformare quella stringa in un oggetto di tipo `Date`?
482
484
483
-
Passiamo a `JSON.parse` la funzione di revitalizzazione che ritorna tutti i valori per "come sono", quindi `date` diventerà `Date`:
485
+
Passiamo a `JSON.parse` la funzione di riattivazione che ritorna tutti i valori per "come sono", quindi `date` diventerà `Date`:
484
486
485
487
```js run
486
488
let str ='{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
- JSON è un formattatore di dati con i suoi standard e che possiede molte librerie che gli consentono di lavorare con molti linguaggio di programmazione.
523
-
- JSON supporta gli oggetti, arrays, strings, numbers, booleans, e `null`.
524
+
- JSON è un formattatore di dati con i suoi standard; possiede molte librerie che gli consentono di lavorare con molti linguaggio di programmazione.
525
+
- JSON supporta oggetti, array, stringhe, numeri, booleani, e `null`.
524
526
- JavaScript fornisce dei metodi: [JSON.stringify](mdn:js/JSON/stringify) per serializzare in JSON e [JSON.parse](mdn:js/JSON/parse) per la lettura da JSON.
525
527
- Entrambi i metodi supportano funzioni di rimpiazzo per scritture/letture "intelligenti".
526
528
- Se un oggetto implementa `toJSON`, questa verrà automaticamente invocata da `JSON.stringify`.
0 commit comments