Como mapear atributos JSON nas propriedades de classes do C#/How to associate JSON attributes in C# class properties

Português   English

Olá.

A linguagem de definição de dados JSON (Java Script Object Notation) tornou-se popular dada a sua simplicidade. Atualmente são muito comuns aplicações que a usam para comunicação dos dados.

No C# existe a biblioteca NewtonSoft JSON que permite rapidamente fazer uso desta linguagem mapeando os atributos e objetos definidos em classes.

Porém é muito comum que a aplicação precise adaptar-se aos atributos que estão presentes no JSON com suas classes já que normalmente estes não batem com as propriedades definidas.

Neste exemplo que foi tirado do meu projeto novo no GITHUB os atributos seguem um padrão diferente do que está usado nas classes.

{
"name":"form1",
"text":"Primeiro formulário",
"type":"OK",
"controls":[
  {
    "name":"txtText1",
    "type":"TextBox",
    "key":"text1",
    "label":"Campo texto",
    "initialValue":"Some text"
  },
  {
    "name":"cboName",
    "type":"ComboBox",
    "key":"name1",
    "label":"Campo múltipla escolha",
    "initialValue":"1",
    "bindingSource": {
        "connection":"Data source=local; Initial catalog=databasename; Integrated security=true;",
        "sql":"SELECT ID, NAME FROM USERS ORDER BY NAME",
        "keyValue":"id",
        "displayValue":"name"
  }}]

}

A tendência inicial é refazer a classe para que as propriedades tenham o mesmo nome dos atributos JSON. Só que se você estiver usando a biblioteca que mencionei acima, isso não é necessário.

Basta você usar um recurso do C# Data annotations.

Basicamente consiste em se colocar atributos acima das propriedades criando um alias para a propriedade associando-as com o atributo JSON:

using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; namespace WindowsForms { /// <summary> /// Class to build a dynamic form /// </summary> [Serializable] public class DynamicDialog { #region fields string _dialogType; IEnumerable<string> _validDialogTypes = new List<string>() { "OK", "YesNo" }; DynamicForm _DynamicForm; #endregion #region properties [JsonProperty(PropertyName = "name")] public string FormName { get; set; } [JsonProperty(PropertyName = "text")] public string Text { get; set; } [JsonProperty(PropertyName = "type")] public string DialogType { get { return _dialogType; } set { if (_validDialogTypes.Contains(value)) { _dialogType = value; } else { throw new Exception( "Dialog type is not valid." + "\nCurrent valid types are:\n\n\t\"OK\" and \"YesNo\""); } } } [JsonProperty(PropertyName = "controls")] public List<DynamicControl> DynamicControls { get; set; }

Desta forma é possível usar classes do projeto que já estão funcionando sem a necessidade de reescrever tudo.

Esta é a dica de hoje. Se estiver trabalhando com C# e JSON dê uma conferida. Até a próxima.