Skip to content

Commit e394e78

Browse files
committed
json
1 parent cd721ea commit e394e78

File tree

4 files changed

+56
-54
lines changed

4 files changed

+56
-54
lines changed

1-js/05-data-types/12-json/1-serialize-object/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 5
44

55
# Trasformare l'oggetto in JSON e vice versa
66

7-
Convertite `user` in JSON e successivamente riconvertitelo salvandolo in un altra variabile.
7+
Convertite `user` in JSON e successivamente riconvertitelo salvandolo in un'altra variabile.
88

99
```js
1010
let user = {

1-js/05-data-types/12-json/2-serialize-event-circular/solution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@ alert( JSON.stringify(meetup, function replacer(key, value) {
2626
*/
2727
```
2828

29-
In questo caso abbiamo bisogno, oltre che del test su `key==""`, anche di quello su `value`, per escludere il caso in cui quest ultimo valga `meetup`.
29+
In questo caso abbiamo bisogno, oltre che del test su `key==""`, anche di quello su `value`, per escludere il caso in cui quest'ultimo valga `meetup`.
3030

1-js/05-data-types/12-json/2-serialize-event-circular/task.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ let meetup = {
2222
};
2323

2424
*!*
25-
// circular references
25+
// referenze circolari
2626
room.occupiedBy = meetup;
2727
meetup.self = meetup;
2828
*/!*
2929

3030
alert( JSON.stringify(meetup, function replacer(key, value) {
31-
/* your code */
31+
/* il tuo codice */
3232
}));
3333

34-
/* result should be:
34+
/* il risultato dovrebbe essere:
3535
{
3636
"title":"Conference",
3737
"occupiedBy":[{"name":"John"},{"name":"Alice"}],

1-js/05-data-types/12-json/article.md

Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Metodi JSON, toJSON
22

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.
44

55
Naturalmente, una stringa di questo tipo deve includere tutte le proprietà importanti.
66

@@ -21,7 +21,7 @@ let user = {
2121
alert(user); // {name: "John", age: 30}
2222
```
2323

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".
2525

2626
Fortunatamente, non c'è bisogno di scrivere del codice per gestire questa situazione.
2727

@@ -34,7 +34,7 @@ JavaScript fornisce i metodi:
3434
- `JSON.stringify` per convertire oggetti in JSON.
3535
- `JSON.parse` per convertire JSON in oggetto.
3636

37-
Ad esempio, abbiamo `JSON.stringify` uno studente:
37+
Ad esempio, abbiamo `JSON.stringify` per uno studente:
3838
```js run
3939
let student = {
4040
name: 'John',
@@ -48,7 +48,7 @@ let student = {
4848
let json = JSON.stringify(student);
4949
*/!*
5050

51-
alert(typeof json); // we've got a string!
51+
alert(typeof json); //abbiamo una stringa!
5252

5353
alert(json);
5454
*!*
@@ -70,8 +70,8 @@ La stringa `json` risultante viene chiamata *codifica in JSON* o *serializzata*,
7070

7171
Da notare che un oggetto codificato in JSON possiede delle fondamentali differenze da un oggetto letterale:
7272

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`.
7575

7676
`JSON.stringify` può anche essere applicato agli oggetti primitivi.
7777

@@ -88,10 +88,11 @@ I tipi che supportano nativamente JSON sono:
8888
Ad esempio:
8989

9090
```js run
91-
// a number in JSON is just a number
91+
// un numero in JSON è solo un numero
9292
alert( JSON.stringify(1) ) // 1
9393

94-
// a string in JSON is still a string, but double-quoted
94+
// una stringa in JSON è ancora una stringa, ma con doppie virgolette
95+
9596
alert( JSON.stringify('test') ) // "test"
9697

9798
alert( JSON.stringify(true) ); // true
@@ -109,14 +110,14 @@ Tra cui:
109110

110111
```js run
111112
let user = {
112-
sayHi() { // ignored
113+
sayHi() { // ignorato
113114
alert("Hello");
114115
},
115-
[Symbol("id")]: 123, // ignored
116-
something: undefined // ignored
116+
[Symbol("id")]: 123, // ignorato
117+
something: undefined // ignorato
117118
};
118119

119-
alert( JSON.stringify(user) ); // {} (empty object)
120+
alert( JSON.stringify(user) ); // {} (oggetto vuoto)
120121
```
121122

122123
Solitamente questo è ciò che vogliamo. Se invece abbiamo intenzioni diverse, molto presto vedremo come controllare il processo.
@@ -137,7 +138,8 @@ let meetup = {
137138
};
138139

139140
alert( JSON.stringify(meetup) );
140-
/* The whole structure is stringified:
141+
/* Tutta la struttura viene serializzata
142+
141143
{
142144
"title":"Conference",
143145
"room":{"number":23,"participants":["john","ann"]},
@@ -159,15 +161,15 @@ let meetup = {
159161
participants: ["john", "ann"]
160162
};
161163

162-
meetup.place = room; // meetup references room
163-
room.occupiedBy = meetup; // room references meetup
164+
meetup.place = room; // meetup referenzia room
165+
room.occupiedBy = meetup; // room referenzia meetup
164166

165167
*!*
166-
JSON.stringify(meetup); // Error: Converting circular structure to JSON
168+
JSON.stringify(meetup); // Errore: conversione di struttura circolare a JSON
167169
*/!*
168170
```
169171

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`:
171173

172174
![](json-meetup.svg)
173175

@@ -189,7 +191,7 @@ replacer
189191
space
190192
: Quantità di spazio da utilizzare per la formattazione
191193

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`.
193195

194196
Se forniamo un array di proprietà, solamente quelle proprietà verranno codificate.
195197

@@ -203,18 +205,18 @@ let room = {
203205
let meetup = {
204206
title: "Conference",
205207
participants: [{name: "John"}, {name: "Alice"}],
206-
place: room // meetup references room
208+
place: room // meetup referenzia room
207209
};
208210

209-
room.occupiedBy = meetup; // room references meetup
211+
room.occupiedBy = meetup; // room referenzia meetup
210212

211213
alert( JSON.stringify(meetup, *!*['title', 'participants']*/!*) );
212214
// {"title":"Conference","participants":[{},{}]}
213215
```
214216

215-
Qui siamo 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.
216218

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:
218220

219221
```js run
220222
let room = {
@@ -224,10 +226,10 @@ let room = {
224226
let meetup = {
225227
title: "Conference",
226228
participants: [{name: "John"}, {name: "Alice"}],
227-
place: room // meetup references room
229+
place: room // meetup referenzia room
228230
};
229231

230-
room.occupiedBy = meetup; // room references meetup
232+
room.occupiedBy = meetup; // room referenzia meetup
231233

232234
alert( JSON.stringify(meetup, *!*['title', 'participants', 'place', 'name', 'number']*/!*) );
233235
/*
@@ -239,9 +241,9 @@ alert( JSON.stringify(meetup, *!*['title', 'participants', 'place', 'name', 'num
239241
*/
240242
```
241243

242-
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.
243245

244-
Fortunatamente, possiamo utilizzare una funzione come `replacer`, piuttosto che un array.
246+
Fortunatamente, possiamo utilizzare come `replacer` una funzione piuttosto di un array.
245247

246248
La funzione verrà invocata per ogni coppia `(key, value)` e dovrebbe ritornare il valore sostitutivo, che verrà utilizzato al posto di quello originale.
247249

@@ -255,17 +257,17 @@ let room = {
255257
let meetup = {
256258
title: "Conference",
257259
participants: [{name: "John"}, {name: "Alice"}],
258-
place: room // meetup references room
260+
place: room // meetup referenzia room
259261
};
260262

261-
room.occupiedBy = meetup; // room references meetup
263+
room.occupiedBy = meetup; // room referenzia meetup
262264

263265
alert( JSON.stringify(meetup, function replacer(key, value) {
264266
alert(`${key}: ${value}`);
265267
return (key == 'occupiedBy') ? undefined : value;
266268
}));
267269

268-
/* key:value pairs that come to replacer:
270+
/* coppie key:value passate al replacer:
269271
: [object Object]
270272
title: Conference
271273
participants: [object Object],[object Object]
@@ -279,17 +281,17 @@ occupiedBy: [object Object]
279281
*/
280282
```
281283

282-
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.
283285

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]"`.
285287

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.
287289

288290
## Formattazione: spacer
289291

290292
Il terzo argomento di `JSON.stringify(value, replacer, spaces)` è il numero di spazi da utilizzare per una corretta formattazione.
291293

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.
293295

294296
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:
295297

@@ -304,7 +306,7 @@ let user = {
304306
};
305307

306308
alert(JSON.stringify(user, null, 2));
307-
/* two-space indents:
309+
/* indentazione di due spazi:
308310
{
309311
"name": "John",
310312
"age": 25,
@@ -315,7 +317,7 @@ alert(JSON.stringify(user, null, 2));
315317
}
316318
*/
317319

318-
/* for JSON.stringify(user, null, 4) the result would be more indented:
320+
/* Per JSON.stringify(user, null, 4) il risultato sarebbe più indentato:
319321
{
320322
"name": "John",
321323
"age": 25,
@@ -331,7 +333,7 @@ Il parametro `spaces` viene utilizzato unicamente per procedure di logging o per
331333

332334
## Modificare "toJSON"
333335

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.
335337

336338
Ad esempio:
337339

@@ -408,12 +410,12 @@ str
408410
: stringa JSON da decodificare.
409411

410412
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.
412414

413415
Ad esempio:
414416

415417
```js run
416-
// stringified array
418+
// array serializzato
417419
let numbers = "[0, 1, 2, 3]";
418420

419421
numbers = JSON.parse(numbers);
@@ -437,25 +439,25 @@ Alcuni errori tipici di scrittura in JSON (in qualche caso lo utilizzeremo per s
437439

438440
```js
439441
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
445447
}`;
446448
```
447449

448450
Inoltre, JSON non supporta i commenti. Quindi l'aggiunta di un commento invaliderebbe il documento.
449451

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.
451453

452454
Il JSON classico è cosi restrittivo non per pigrizia degli sviluppatori, ma per consentire una facile, affidabile e rapida implementazione degli algoritmi di analisi.
453455

454-
## Riportare in vita
456+
## Ritrasformare in oggetto
455457

456458
Immaginate di ricevere dal server un oggetto `meetup` serializzato.
457459

458-
Assomiglia:
460+
Come:
459461

460462
```js
461463
// title: (meetup title), date: (meetup date)
@@ -480,7 +482,7 @@ Whoops! Errore!
480482

481483
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`?
482484

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`:
484486

485487
```js run
486488
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
@@ -519,8 +521,8 @@ alert( schedule.meetups[1].date.getDate() ); // works!
519521

520522
## Riepilogo
521523

522-
- 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`.
524526
- 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.
525527
- Entrambi i metodi supportano funzioni di rimpiazzo per scritture/letture "intelligenti".
526528
- Se un oggetto implementa `toJSON`, questa verrà automaticamente invocata da `JSON.stringify`.

0 commit comments

Comments
 (0)