2011-01-17 22 views
6

Ho un oggetto JSON complesso che voglio rappresentare come classe C#. Ho un vantaggio sulla classe genitore chiamata "Form", ma come posso rappresentare una collezione per diversi tipi (vedi l'oggetto "elementi" sotto)?Come convertire le classi JSON in C#?

Ecco l'oggetto JSON:

{ 
    "action": "index.html", 
    "method": "post", 
    "elements": 
[ 
{ 
    "type": "fieldset", 
    "caption": "User information", 
    "elements": 
    [ 
     { 
      "name": "email", 
      "caption": "Email address", 
      "type": "text", 
      "placeholder": "E.g. [email protected]", 
      "validate": 
      { 
       "email": true 
      } 
     }, 
     { 
      "name": "password", 
      "caption": "Password", 
      "type": "password", 
      "id": "registration-password", 
      "validate": 
      { 
       "required": true, 
       "minlength": 5, 
       "messages": 
       { 
        "required": "Please enter a password", 
        "minlength": "At least {0} characters long" 
       } 
      } 
     }, 
     { 
      "name": "password-repeat", 
      "caption": "Repeat password", 
      "type": "password", 
      "validate": 
      { 
       "equalTo": "#registration-password", 
       "messages": 
       { 
        "equalTo": "Please repeat your password" 
       } 
      } 
     }, 
     { 
      "type": "radiobuttons", 
      "caption": "Sex", 
      "name": "sex", 
      "class": "labellist", 
      "options": 
      { 
       "f": "Female", 
       "m": "Male" 
      } 
     } 
    ] 
] 
} 

La classe che ho inizio assomiglia a questo:

public class Form 
{ 
    public Guid id 
    { 
     get; 
     set; 
    } 

    public string action 
    { 
     get; 
     set; 
    } 

    public string method 
    { 
     get; 
     set; 
    } 

    public ??? elements 
    { 
     get; 
     set; 
    } 

    public Form() 
    { 

    } 
} 

Come si gestiscono gli "elementi" di proprietà per ottenere il risultato desiderato JSON?

Sto utilizzando WCF 4.0 con questi attributi nel web.config: automaticFormatSelectionEnabled = "false", defaultOutgoingResponseFormat = "Json". Qualsiasi aiuto o idea sarebbe molto apprezzato.

+0

hai visto questo? http://json.codeplex.com/ anche ... sembra che gli elementi saranno un oggetto personalizzato su se stesso che dovrà essere anche deserializzato – timothyclifford

+0

Thx .. Sto guardando "CustomCreationConverter" dalla libreria e anche pesando usando set di dati. La mia preoccupazione principale è quella di mantenere in modo pulito i valori nel database e di gestirli/modificarli facilmente. – TruMan1

risposta

1

Wow. Domanda affascinante Forse usare ExpandoObject/dynamic?

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx

http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx?PageIndex=4

o anonimo tipi penso siano serializable con il built-in .NET JSON serializzatore.

+0

Buona idea con tipi dinamici. Mapparlo in un database non sarebbe strutturato e io immagino che i tipi dinamici siano lenti (riflessione?). Forse DataSet ed EntityFramework sarebbero un buon modo per andare. Invece di mappare le classi, dovrei probabilmente pensare prima allo schema invece ... Thx1 – TruMan1

+0

Ho iniziato una discussione per l'approccio totalmente opposto a questo dilemma .. ancora non sono sicuro se dovrei mappare prima le classi o il database: http: // stackoverflow.com/questions/4724465/how-to-map-json-to-sql-schema – TruMan1

2

Se non hanno la libertà di usare dinamica tipi da .NET 4 o che desiderano sfruttare i vantaggi forniti dalla tipizzazione statica, il progetto JSON Class Generator su codeplex genererà classi C# in base a una stringa di input json. (plug spudorato) Ho anche preso il codice da questo progetto e slapped a web UI on it.

+0

Qualche possibilità di lanciare una casella di controllo per renderla 'UpperCamelCase'? (chiedere spudorato) – Rippo