Modellazione di JSON con Javascript

0

Uso di C # Ho modellato un messaggio JSON in questo modo:

public class MessageBase<T>
{
    public MessageBase() { this.message = new List<T>(); }
    public string type { get; set; }
    public string id { get; set; }
    public List<T> message { get; set; }
}

public class LogonRequest
{
    public string userName { get; set; }
    public string password { get; set; }
}

MessageBase<LogonRequest> logon = new MessageBase<LogonRequest>()
{
    id = Guid.NewGuid().ToString(),
    type = "Logon"
};

logon.message.Add(new LogonRequest() {userName = "user", password = "123"});

var message = (new JavaScriptSerializer()).Serialize(logon);

Sono un principiante di JavaScript e sto provando a fare qualcosa di simile come il mio codice C # ma questo è il migliore che ho trovato finora. Esiste un modo più standard per definire questa struttura dei messaggi e riutilizzarla utilizzando JavaScript?

var messageObj = {id: 123456789, 
                  type: 'Logon',
                  message:[{username:'user', password:'123' }]
                 };

var message = JSON.stringify(messageObj);    
    
posta ddrjca 26.09.2017 - 14:37
fonte

1 risposta

0

Puoi ottenere lo stesso comportamento da Javascript, con l'avvertenza che Javascript non è un linguaggio tipizzato, che riduce le tue opzioni di modellazione.

Un concetto che rende i tuoi modelli C # MessageBase<T> e LogonRequest possibili è il concetto di classi che è incorporato nel linguaggio. A differenza di C #, vanilla Javascript non ha un concetto di classe, e anche in ES6 con la parola chiave class , paga per capire le differenze semantiche tra l'ereditarietà del prototipo di Javascript e la classe di un linguaggio orientato agli oggetti di prima classe.

In primo luogo, un esempio di sintassi di quei modelli che utilizzano pre-ES6 Javascript:

function Message(id, type, list) {
  this.id = id;
  this.type = type;
  if('undefined' === typeof(list)) {
    this.message = [];
  } else { this.message = list; }
}

function LogonRequest(userName, password) {
  this.userName = userName;
  this.password = password;
}

var logonRequest = new LogonRequest('user', '123');
var messageObj = new Message(123456789, 'Logon', logonRequest);
var message = JSON.stringify(messageObj);

Nell'esempio sopra, le funzioni LogonRequest e Message sono chiamate "il costruttore" di quelle classi, e il this all'interno di quelle funzioni è il contesto this che è posto dove la funzione è chiamato (controlla una spiegazione pertinente per maggiori informazioni su come funziona this ). Ciò rende importante l'utilizzo della parola chiave new , come avviene nelle seguenti righe, che crea un nuovo contesto oggetto a cui si applica this .

ES6 migliora in qualche modo questa sintassi, dandoci il seguente modulo equivalente:

class Message {
  constructor(id, type, list) {
    this.id = id;
    this.type = type;
    if('undefined' === typeof(list)) {
      this.message = [];
    } else { this.message = list; }
  }
}

Ma il suo uso e i suoi meccanismi interni sono esattamente gli stessi di sopra.

Vale la pena notare che alcuni sviluppatori non amano questo aspetto di Javascript e preferiscono un'espressione sintattica più strongmente tipizzata come fornisce C #. Questo è ciò che spiega l'avvento di un certo numero di lingue che traspongono in Javascript, in particolare Typescript, che consente una sintassi molto simile in semantica al tuo esempio in C #.

    
risposta data 26.09.2017 - 18:19
fonte

Leggi altre domande sui tag